Java中的运算符>>>
和>>
之间有什么区别?
答案 0 :(得分:364)
>>
是算术右移,>>>
是逻辑右移。
在算术移位中,符号位被扩展以保留数字的有符号。
例如:以8位表示的-2将是11111110
(因为最重要的位具有负权重)。使用算术移位将其向右移一位会得到11111111
或-1。然而,逻辑右移并不关心该值可能代表有符号数;它只是将所有内容移动到右侧,并从左侧填充0。使用逻辑移位将我们的-2右移一位将给01111111
。
答案 1 :(得分:90)
>>>
是无符号转换;它将插入0. >>
已签名,并将扩展符号位。
移位运算符包括左移
<<
,右移>>
和无符号右移>>>
。
n>>s
的值为n
右移s
位位置符号扩展。
n>>>s
的值是n
右移s
位位置零扩展。
System.out.println(Integer.toBinaryString(-1));
// prints "11111111111111111111111111111111"
System.out.println(Integer.toBinaryString(-1 >> 16));
// prints "11111111111111111111111111111111"
System.out.println(Integer.toBinaryString(-1 >>> 16));
// prints "1111111111111111"
更明确地添加积极的对手
System.out.println(Integer.toBinaryString(121));
// prints "1111001"
System.out.println(Integer.toBinaryString(121 >> 1));
// prints "111100"
System.out.println(Integer.toBinaryString(121 >>> 1));
// prints "111100"
由于它是正数,有符号和无符号的移位都会向最左边的位添加0。
1 >>> 32 == 1
答案 2 :(得分:46)
它们都是右移,但>>>
是unsigned
无符号右移运算符“&gt;&gt;&gt;”将零移动到最左边的位置,而在“&gt;&gt;”之后的最左边的位置移动取决于符号扩展。
答案 3 :(得分:37)
>>>
总是会在最左边的位置放置0,而>>
会将1或0放在最左边的位置。
答案 4 :(得分:36)
逻辑右移(v >>> n
)返回一个值,其中v
中的位已被n
位位置向右移位,并且0'被移位从左侧开始。考虑移位以二进制编写的8位值:
01111111 >>> 2 = 00011111
10000000 >>> 2 = 00100000
如果我们将这些位解释为无符号非负整数,则逻辑右移具有将数字除以相应的2的幂的效果。但是,如果数字是以二进制补码表示,则逻辑右转移不能正确划分负数。例如,当位被解释为无符号数时,上面的第二右移位移128到32。但是,当Java中的典型情况下,这些位被解释为两个补码时,它会将-128移至32位。
因此,如果要移动以除以2的幂,则需要算术右移(v >> n
)。它返回一个值,其中v
中的位已被n
位位置向右移位,而最左边的位的副本从左侧移入侧:
01111111 >> 2 = 00011111
10000000 >> 2 = 11100000
当比特是二进制补码表示中的数字时,算术右移具有除以2的幂的效果。这是有效的,因为最左边的位是符号位。除以2的幂必须使符号保持不变。
答案 5 :(得分:9)
详细了解Bitwise and Bit Shift Operators
>> Signed right shift
>>> Unsigned right shift
位模式由左侧操作数给出,位置数由右侧操作数移位。无符号右移运算符>>>
将零移至最左侧位置,
>>
之后的最左侧位置取决于符号扩展名。
简单地说>>>
总是将零移到最左边的位置,而>>
根据数字的符号移位,即1为负数数字和0表示正数。
例如尝试使用负数和正数。
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));
输出:
11111111111111111111111111011001
11111111111111111111111101100100
111111111111111111111111011001
11111111111111111111111101100100
100110
10011000
100110
10011000
答案 6 :(得分:5)
右移逻辑运算符(>>> N
)将位向右移位N位,丢弃符号位并用0'填充N个最左位。例如:
-1 (in 32-bit): 11111111111111111111111111111111
在>>> 1
操作变为:之后
2147483647: 01111111111111111111111111111111
右移算术运算符(>> N
)也将位向右移位N位,但保留符号位并将N个最左位填充为1。例如:
-2 (in 32-bit): 11111111111111111111111111111110
在>> 1
操作变为:之后
-1: 11111111111111111111111111111111