Difference between >>> and >>
在Java中,操作符EDOCX1 0和EDCOX1 1的区别是什么?
在算术移位中,符号位被扩展以保持数字的符号性。
例如:8位表示的-2是
The shift operators include left shift
<< , signed right shift>> , and unsigned right shift>>> .The value of
n>>s isn right-shifteds bit positions with sign-extension.The value of
n>>>s isn right-shifteds bit positions with zero-extension.
1 2 3 4 5 6 |
为了使事情更清楚,增加积极的对应物
1 2 3 4 5 6 |
因为它是正的,有符号移位和无符号移位都会将0添加到最左边的位。
相关问题- 右移位执行-1上的除以2
- 在Java中,移位位比乘法和除法快吗?.NET?
- 什么是C/C++等效方式"> >",如Java(无符号右移位)
- 负逻辑移位
- Java> > > > >操作符?
- Java运营商>与>之间的区别是什么?
- >>和>>运算符之间的差异
- 高级语言如C/J/Java屏蔽了位移位计数操作数的原因是什么?
1 >>> 32 == 1
它们都是右移位,但
从文档中:
The unsigned right shift operator">>>" shifts a zero into the leftmost position, while the leftmost position after">>" depends on sign extension.
逻辑右移(
1 2 | 01111111 >>> 2 = 00011111 10000000 >>> 2 = 00100000 |
如果我们将这些位解释为无符号非负整数,则逻辑右移将数字除以相应的2的幂。但是,如果数字是二的补码表示,逻辑右移不能正确地除负数。例如,当位被解释为无符号数字时,上面的第二个右移位将移位128到32。但是当它在Java中是典型的时,它会在128到32之间移位。
因此,如果要移动以除以2的幂,则需要算术右移(
1 2 | 01111111 >> 2 = 00011111 10000000 >> 2 = 11100000 |
当位是二补表示中的一个数时,算术右移具有除以二次幂的效果。这是因为最左边的位是符号位。除以二的幂必须保持符号不变。
阅读有关位和位移位运算符的更多信息
1 2 | >> Signed right shift >>> Unsigned right shift |
位模式由左侧操作数给出,位置数由右侧操作数移动。无符号右移位运算符
而在
简而言之,
例如,尝试使用负数和正数。
1 2 3 4 5 6 7 8 9 10 11 12 13 | int c = -153; System.out.printf("%32s%n",Integer.toBinaryString(c >>= 2)); System.out.printf("%32s%n",Integer.toBinaryString(c <<= 2)); System.out.printf("%32s%n",Integer.toBinaryString(c >>>= 2)); System.out.println(Integer.toBinaryString(c <<= 2)); System.out.println(); c = 153; System.out.printf("%32s%n",Integer.toBinaryString(c >>= 2)); System.out.printf("%32s%n",Integer.toBinaryString(c <<= 2)); System.out.printf("%32s%n",Integer.toBinaryString(c >>>= 2)); System.out.printf("%32s%n",Integer.toBinaryString(c <<= 2)); |
输出:
1 2 3 4 5 6 7 8 9 | 11111111111111111111111111011001 11111111111111111111111101100100 111111111111111111111111011001 11111111111111111111111101100100 100110 10011000 100110 10011000 |
右移位逻辑运算符(
1 | -1 (in 32-bit): 11111111111111111111111111111111 |
在
1 | 2147483647: 01111111111111111111111111111111 |
右移位算术运算符(
1 | -2 (in 32-bit): 11111111111111111111111111111110 |
在
1 | -1: 11111111111111111111111111111111 |