Day9-29.Shift operators
来源:互联网 发布:mac截图不在桌面 编辑:程序博客网 时间:2024/06/07 20:40
移位操作符
移位操作符操作的运算对象也是二进制的“位”。
移位操作符只可用来处理整数类型(基本类型的一种)。
左移位操作符(<<)能按照操作符右侧制定的位数将操作符左边的操作数向左移动(在低位补0)。
“有符号”右移位操作符(>>)则按照操作符右侧制定的位数将操作符左边的操作数向右移动。
“有符号”右移位操作符使用“符号扩展”:若符号为正,则在高位插入0;若符号位负,则在高位插入1.
Java中增加了一种“无符号”右移位操作符(>>>),它使用“零扩展”:无论正负,都在高位插入0.
这一操作符是C或C++中所没有的。
如果对char、byte或者short类型的数值进行移位处理,name在移位进行之前,它们会被转换成int类型,
并且得到的结果也是一个int类型的值。只有数值有段的低5位才有用。
这样可防止我们移位超过int型值所具有的位数。(因为2的5次方位32,而int型值只有32位。)
若对一个long类型的数值进行处理,最后得到的结果也是long。
此时只会用到数值右端的低6位,以防止移位超过long型数值具有的位数。
“移位”可与“等号”(<<=或>>=或>>>=)组合使用。
此时,操作符左边的值会移动由右边的值指定的位数,再将得到的结果赋给左边的变量。
但在进行“无符号”右移位结合赋值操作时,可能会遇到一个问题:如果对byte或short值进行这样的移位运算,
得到的可能不是正确的结果。
它们会先被转换成int类型,再进行右移操作,然后被截断,赋值给原来的类型。在这种情况下可能得到-1的结果。
下面这个例子演示了这种情况:
//: operators/URShift.java// Test of unsigned right shift.import static net.mindview.util.Print.*;public class URShift { public static void main(String[] args) { int i = -1; print(Integer.toBinaryString(i)); i >>>= 10; print(Integer.toBinaryString(i)); long l = -1; print(Long.toBinaryString(l)); l >>>= 10; print(Long.toBinaryString(l)); short s = -1; print(Integer.toBinaryString(s)); s >>>= 10; print(Integer.toBinaryString(s)); byte b = -1; print(Integer.toBinaryString(b)); b >>>= 10; print(Integer.toBinaryString(b)); b = -1; print(Integer.toBinaryString(b)); print(Integer.toBinaryString(b>>>10)); }} /* Output:111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111*///:~
在最后一个移位运算中,结果没有赋给b,而是直接打印出来,所以其结果是正确的。
下面这个例子向大家阐释了如何应用涉及“按位”操作的所有操作符:
//: operators/BitManipulation.java// Using the bitwise operators.import java.util.*;import static net.mindview.util.Print.*;public class BitManipulation { public static void main(String[] args) { Random rand = new Random(47); int i = rand.nextInt(); int j = rand.nextInt(); printBinaryInt("-1", -1); printBinaryInt("+1", +1); int maxpos = 2147483647; printBinaryInt("maxpos", maxpos); int maxneg = -2147483648; printBinaryInt("maxneg", maxneg); printBinaryInt("i", i); printBinaryInt("~i", ~i); printBinaryInt("-i", -i); printBinaryInt("j", j); printBinaryInt("i & j", i & j); printBinaryInt("i | j", i | j); printBinaryInt("i ^ j", i ^ j); printBinaryInt("i << 5", i << 5); printBinaryInt("i >> 5", i >> 5); printBinaryInt("(~i) >> 5", (~i) >> 5); printBinaryInt("i >>> 5", i >>> 5); printBinaryInt("(~i) >>> 5", (~i) >>> 5); long l = rand.nextLong(); long m = rand.nextLong(); printBinaryLong("-1L", -1L); printBinaryLong("+1L", +1L); long ll = 9223372036854775807L; printBinaryLong("maxpos", ll); long lln = -9223372036854775808L; printBinaryLong("maxneg", lln); printBinaryLong("l", l); printBinaryLong("~l", ~l); printBinaryLong("-l", -l); printBinaryLong("m", m); printBinaryLong("l & m", l & m); printBinaryLong("l | m", l | m); printBinaryLong("l ^ m", l ^ m); printBinaryLong("l << 5", l << 5); printBinaryLong("l >> 5", l >> 5); printBinaryLong("(~l) >> 5", (~l) >> 5); printBinaryLong("l >>> 5", l >>> 5); printBinaryLong("(~l) >>> 5", (~l) >>> 5); } static void printBinaryInt(String s, int i) { print(s + ", int: " + i + ", binary:\n " + Integer.toBinaryString(i)); } static void printBinaryLong(String s, long l) { print(s + ", long: " + l + ", binary:\n " + Long.toBinaryString(l)); }} /* Output:-1, int: -1, binary: 11111111111111111111111111111111+1, int: 1, binary: 1maxpos, int: 2147483647, binary: 111 1111 1111 1111 1111 1111 1111 1111maxneg, int: -2147483648, binary: 1000 0000 0000 0000 0000 0000 0000 0000i, int: -1172028779, binary: 1011 1010 0010 0100 0100 0010 1001 0101~i, int: 1172028778, binary: 100 0101 1101 1011 1011 1101 0110 1010-i, int: 1172028779, binary: 100 0101 1101 1011 1011 1101 0110 1011j, int: 1717241110, binary: 110 0110 0101 1011 0000 0101 0001 0110i & j, int: 570425364, binary: 10 0010 0000 0000 0000 0000 0001 0100i | j, int: -25213033, binary: 1111 1110 0111 1111 0100 0111 1001 0111i ^ j, int: -595638397, binary: 1101 1100 0111 1111 0100 0111 1000 0011i << 5, int: 1149784736, binary: 100 0100 1000 1000 0101 0010 1010 0000i >> 5, int: -36625900, binary: 1111 1101 1101 0001 0010 0010 0001 0100(~i) >> 5, int: 36625899, binary: 10 0010 1110 1101 1101 1110 1011i >>> 5, int: 97591828, binary: 1011 101 0001 0010 0010 0001 0100(~i) >>> 5, int: 36625899, binary: 10 0010 1110 1101 1101 1110 1011...*///:~
程序末尾调用了两个方法:printBinaryInt()和printBinaryLong().
它们分别接受int或long型的参数,并用二进制格式输出,同时附有简要的说明文字。
上面的例子还展示了对int和long的所有按位操作符的作用,还展示了int和long的最大值、最小值、+1和-1值,
以及它们的二进制形式,以使大家了解它们在机器中的具体形式。
注意最高位表示符号:0为正,1为负。
关于int部分的输出正如上面所示。
数字的二进制表示形式成为“有符号的二进制补码”。
- Day9-29.Shift operators
- Day9-28.Bitwise operators
- 14.8 Shift operators
- day9
- day9
- Day9
- DAY9
- day9
- Day9
- Day9
- DAY9
- Operators
- Operators
- Operators
- Operators
- shift
- shift
- shift
- JS] JS 之删除数组中的元素
- java基础十四 内部类详解
- 字符串
- 工作中错误总结
- 德勤收购云咨询公司Day1 Solutions
- Day9-29.Shift operators
- jquery克隆对象
- 顺时针打印矩阵
- win10系统下在vs2015中配置Caffe的详细过程
- JAVA中判断字符串是否为数字的方法
- SnapHelper,对RecyclerView的功能拓展
- 【系统定制】创建自己的安装包组
- HttpURLConnection用法详解
- 《JavaScript高级程序设计》学习笔记(第二章)