1

我试试代码

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

输出为 2 !

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

4

8 回答 8

8

16 >> 3 是向右位移,相当于除以 8 (2 ** 3)。

16 -> 00010000
         ^
          \
           \
2 ->  00000010
于 2013-07-10T18:49:38.420 回答
3

这称为零填充右移也称为 -无符号右移)。

为了便于理解,对于每个班次,您的数字除以 2。所以:

16 >>> 3  ==  16 / 2^3 == 16 / 8 == 2

有关更多详细信息,请参阅JLS-Shift 运算符

对于真正的可视化,看看这两个数字的位表示:

16        - 00010000
16 >>> 3  - 00000010 == 2
于 2013-07-10T18:48:13.327 回答
2

运算符正在执行无符号的>>>位右移,当应用于整数时,它具有除以二的效果。特别是,如果整数是 2 的幂,则每次右移都会使值减半。例如:

16 >>> 1 // returns 8
16 >>> 2 // returns 4
16 >>> 3 // returns 2

在二进制形式中,16表示为10000。如果我们将该值向右移动 3 次,则它最终为00010,即2。另外,请查看 Java教程

于 2013-07-10T18:48:27.600 回答
2

另请注意,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
于 2013-07-10T18:53:32.197 回答
0

您正在使用按位移位,请参阅此帖子

在二进制中,每 0 是幂 2 的递增幅度,例如:

10000 = 16

01000 = 8

00100 = 4

00010 = 2

00001 = 1

Java 中的表达式 16 >>> 3 表示将位移动 3 个位置,所以我们只剩下 2 个。

于 2013-07-10T18:48:00.997 回答
0

二进制的 16 是00010000. 您正在将位向右移动三个位置,结果00000010是 2

于 2013-07-10T18:48:30.827 回答
0

这是一个位移,除以 2^3(由于位移 3 个位置)和截断(向下舍入),因为我们没有进行填充。

使用时,>>>我们向右移动并划分。使用<<<时相反,因此您将乘以 2 的正确幂。

位移是一种按位运算,直接对原始(几乎总是数字)位进行操作。

于 2013-07-10T18:48:58.333 回答
0

它是一个无符号右移运算符,上面移动了3次。

即它每次除以 2 ,给你2

有关 Java 运算符的更多信息,请参见此处

于 2013-07-10T18:49:19.577 回答