Difference between >>> and >>
Java中的操作符>>>
和>>
什么区别?
>>
is arithmetic shift right, >>>
is logical shift right.
In an arithmetic shift, the sign bit is extended to preserve the signedness of the number.
For example: -2 represented in 8 bits would be 11111110
(because the most significant bit has negative weight). Shifting it right one bit using arithmetic shift would give you 11111111
, or -1. Logical right shift, however, does not care that the value could possibly represent a signed number; it simply moves everything to the right and fills in from the left with 0s. Shifting our -2 right one bit using logical shift would give 01111111
.
>>>
is unsigned-shift; it'll insert 0. >>
is signed, and will extend the sign bit.
JLS 15.19 Shift Operators
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 .
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"
To make things more clear adding positive counterpart
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"
Since it is positive both signed and unsigned shifts will add 0 to left most bit.
Related questions
1 >>> 32 == 1
They are both right-shift, but >>>
is unsigned
From the documentation:
The unsigned right shift operator ">>>" shifts a zero into the leftmost position, while the leftmost position after ">>" depends on sign extension.
链接地址: http://www.djcxy.com/p/80900.html上一篇: 如何暂停显示工具提示的标题属性?
下一篇: >>>和>>之间的区别