关于java:>>>之间的区别

Difference between >>> and >>

在Java中,操作符EDOCX1 0和EDCOX1 1的区别是什么?


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

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

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


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

JLS 15.19轮班操作员

The shift operators include left shift <<, signed right shift >>, and unsigned right shift >>>.

The value of n>>s is n right-shifted s bit positions with sign-extension.

The value of n>>>s is n right-shifted s bit positions with zero-extension.

1
2
3
4
5
6
    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"

为了使事情更清楚,增加积极的对应物

1
2
3
4
5
6
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上的除以2
  • 在Java中,移位位比乘法和除法快吗?.NET?
  • 什么是C/C++等效方式"> >",如Java(无符号右移位)
  • 负逻辑移位
  • Java> > > > >操作符?
  • Java运营商>与>之间的区别是什么?
  • >>和>>运算符之间的差异
  • 高级语言如C/J/Java屏蔽了位移位计数操作数的原因是什么?
    • 1 >>> 32 == 1


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

从文档中:

The unsigned right shift operator">>>" shifts a zero into the leftmost position, while the leftmost position after">>" depends on sign extension.


逻辑右移(v >>> n返回一个值,其中v中的位被n位位置右移,0从左侧移入。考虑移动8位值,以二进制形式写入:

1
2
01111111 >>> 2 = 00011111
10000000 >>> 2 = 00100000

如果我们将这些位解释为无符号非负整数,则逻辑右移将数字除以相应的2的幂。但是,如果数字是二的补码表示,逻辑右移不能正确地除负数。例如,当位被解释为无符号数字时,上面的第二个右移位将移位128到32。但是当它在Java中是典型的时,它会在128到32之间移位。

因此,如果要移动以除以2的幂,则需要算术右移(v >> n)。它返回一个值,其中v中的位被n位位置右移,v最左边的位的拷贝从左边移入:

1
2
01111111 >> 2 = 00011111
10000000 >> 2 = 11100000

当位是二补表示中的一个数时,算术右移具有除以二次幂的效果。这是因为最左边的位是符号位。除以二的幂必须保持符号不变。


>>>总是在最左边的一个位上加0,而>>根据符号的大小加1或0。


阅读有关位和位移位运算符的更多信息

1
2
>>      Signed right shift
>>>     Unsigned right shift

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

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

简而言之,>>>总是将零移到最左边的位置,而>>则根据数字的符号移动,即1表示负数,0表示正数。

例如,尝试使用负数和正数。

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


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

1
-1 (in 32-bit): 11111111111111111111111111111111

>>> 1操作之后:

1
2147483647: 01111111111111111111111111111111

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

1
-2 (in 32-bit): 11111111111111111111111111111110

>> 1操作之后,变为:

1
-1: 11111111111111111111111111111111