>>>之间的差异和>>

时间:2010-05-11 14:02:20

标签: java syntax operators

Java中的运算符>>>>>之间有什么区别?

7 个答案:

答案 0 :(得分:364)

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

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

例如:以8位表示的-2将是11111110(因为最重要的位具有负权重)。使用算术移位将其向右移一位会得到11111111或-1。然而,逻辑右移并不关心该值可能代表有符号数;它只是将所有内容移动到右侧,并从左侧填充0。使用逻辑移位将我们的-2右移一位将给01111111

答案 1 :(得分:90)

>>>是无符号转换;它将插入0. >>已签名,并将扩展符号位。

JLS 15.19 Shift Operators

  

移位运算符包括左移<<,右移>>和无符号右移>>>

     

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。

相关问题

答案 2 :(得分:46)

它们都是右移,但>>>unsigned

来自documentation

  

无符号右移运算符“&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