Java中的>>>和>>操作符有什么区别?


当前回答

它们都是右移,但是>>>是无符号的

从文档中可以看到:

无符号右移运算符“>>>”将0移到最左边的位置,而“>>”之后的最左边位置取决于符号扩展。

其他回答

右移逻辑运算符(>>> N)将位右移N位,丢弃符号位,并用0填充最左边的N位。例如:

-1 (in 32-bit): 11111111111111111111111111111111

>>> 1操作后:

2147483647: 01111111111111111111111111111111

右移算术运算符(>> N)也将位右移N位,但保留符号位并将最左边的N位填充为1。例如:

-2 (in 32-bit): 11111111111111111111111111111110

>> 1操作后变为:

-1: 11111111111111111111111111111111

>>>总是在最左边放一个0,而>>会放一个1或0,这取决于它的符号是什么。

>>  Signed right shift 
>>> Unsigned right shift

例子:-

byte x, y;  x=10;  y=-10;  
SOP("Bitwise Left Shift: x<<2 = "+(x<<2));  
SOP("Bitwise Right Shift: x>>2 = "+(x>>2));  
SOP("Bitwise Zero Fill Right Shift: x>>>2 = "+(x>>>2));  
SOP("Bitwise Zero Fill Right Shift: y>>>2 = "+(y>>>2));

输出将是:-

Bitwise Left Shift: x<<2 = 40
Bitwise Right Shift: x>>2 = 2
Bitwise Zero Fill Right Shift: x>>>2 = 2
Bitwise Zero Fill Right Shift: y>>>2 = 1073741821

阅读更多关于按位和位移位操作符

>>      Signed right shift
>>>     Unsigned right shift

位模式由左操作数给出,而右操作数要移位的位置数。无符号右移运算符>>>将0移到最左边的位置,

而>>之后最左边的位置取决于符号扩展。

简单地说,>>>总是将0移到最左边的位置,而>>则根据数字的符号进行移动,即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

>>是算术右移,>>>是逻辑右移。

在算术移位中,符号位被扩展以保持数字的有号性。

例如:用8位表示的-2将是11111110(因为最高位的权值为负)。用算术移位向右移动一位,就会得到11111111,或者-1。然而,逻辑右移并不关心该值是否可能表示有符号的数字;它只是把所有东西都移到右边,然后从左边填上0。使用逻辑移位将-2右移一位将得到01111111。