System.out.println(16>>> 3)?

时间:2013-07-10 18:46:36

标签: java jvm

我尝试了代码

System.out.println( 16 >>> 3);

,输出为2!

但这是如何工作的?语法是什么?

8 个答案:

答案 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)

这是无符号右移操作符,上面的移位 3 次。

即。它每次除以2,给你 2

有关Java运算符的更多信息,请参阅here