我试试代码
System.out.println( 16 >>> 3);
输出为 2 !
但这是如何工作的?语法是什么?
16 >> 3 是向右位移,相当于除以 8 (2 ** 3)。
16 -> 00010000
^
\
\
2 -> 00000010
这称为零填充右移(也称为 -无符号右移)。
为了便于理解,对于每个班次,您的数字除以 2。所以:
16 >>> 3 == 16 / 2^3 == 16 / 8 == 2
有关更多详细信息,请参阅JLS-Shift 运算符。
对于真正的可视化,看看这两个数字的位表示:
16 - 00010000
16 >>> 3 - 00000010 == 2
运算符正在执行无符号的>>>
位右移,当应用于整数时,它具有除以二的效果。特别是,如果整数是 2 的幂,则每次右移都会使值减半。例如:
16 >>> 1 // returns 8
16 >>> 2 // returns 4
16 >>> 3 // returns 2
在二进制形式中,16
表示为10000
。如果我们将该值向右移动 3 次,则它最终为00010
,即2
。另外,请查看 Java教程。
另请注意,3 个 V 形表示无符号右位移。虽然在这个例子中没有什么区别......
extra>
表示该标志不是保留的,例如:
-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
您正在使用按位移位,请参阅此帖子
在二进制中,每 0 是幂 2 的递增幅度,例如:
10000 = 16
01000 = 8
00100 = 4
00010 = 2
00001 = 1
Java 中的表达式 16 >>> 3 表示将位移动 3 个位置,所以我们只剩下 2 个。
二进制的 16 是00010000
. 您正在将位向右移动三个位置,结果00000010
是 2
这是一个位移,除以 2^3(由于位移 3 个位置)和截断(向下舍入),因为我们没有进行填充。
使用时,>>>
我们向右移动并划分。使用<<<
时相反,因此您将乘以 2 的正确幂。
位移是一种按位运算,直接对原始(几乎总是数字)位进行操作。