我尝试了代码
System.out.println( 16 >>> 3);
,输出为2!
但这是如何工作的?语法是什么?
答案 0 :(得分:8)
16>> 3是向右移位,相当于除以8(2 ** 3)。
16 -> 00010000
^
\
\
2 -> 00000010
答案 1 :(得分:3)
这称为右移,其中零填充(也称为 - 无符号右移)。
为了便于理解,对于每个班次,你的数字除以2.所以:
16 >>> 3 == 16 / 2^3 == 16 / 8 == 2
有关详细信息,请参阅JLS - Shift Operators。
对于真实的可视化,请查看两个数字的位表示:
16 - 00010000
16 >>> 3 - 00000010 == 2
答案 2 :(得分:2)
>>>
运算符正在执行无符号的右移位,当应用于整数时,它具有除以2的效果。特别是,如果整数是2的幂,则每个右移恰好将该值减半。例如:
16 >>> 1 // returns 8
16 >>> 2 // returns 4
16 >>> 3 // returns 2
以二进制形式,16
表示为10000
。如果我们将值向右移动三次,则结果为00010
,即2
。另外,请查看Java tutorial。
答案 3 :(得分:2)
另一个注意事项,3个V形符号表示无符号右移位。虽然这个例子没有什么区别......
额外>
表示该标志未被保留,例如:
-128 >> 2 = -128 / 2^2 = -32
保留已签名的位,给出:
(1) 10000000 >> 2 = (1) 100000
11111111 11111111 11111111 10000000 >> 2 = 1111111 11111111 11111111 11100000
如果使用>>>
,则有符号位也会移位,将其转换为正数。
-128 >>> 2 = 536870896
11111111 11111111 11111111 10000000 >> 2 = 0011111 11111111 11111111 11100000
答案 4 :(得分:0)
您正在使用按位移位咨询 this post
在二进制中,每0表示功率2的增加幅度,例如:
10000 = 16
01000 = 8
00100 = 4
00010 = 2
00001 = 1
表达式16>>> java中的3表示将位移动3个位置,因此我们留下2。
答案 5 :(得分:0)
二进制16是00010000
。您正在将位向右移动三个位置,这导致00000010
为2
答案 6 :(得分:0)
这是一个有点移位,除了2 ^ 3(由于移位3个位置)和截断(向下舍入),因为我们没有进行fillaround。
使用>>>
时,我们向右移动并划分。
当使用<<<
时,它会相反,所以你要乘以2的正确幂。
位移是bitwise operation的一种类型,它直接对原始(几乎总是数字)位进行操作。
答案 7 :(得分:0)