Java 中无符号的右移位 “>>>” 运算符

2022-09-01 06:47:26

可能的重复:
为什么 (-1 >>> 32) = -1?

无符号的右移位运算符在最左侧插入一个 0。所以当我这样做

System.out.println(Integer.toBinaryString(-1>>>30))

输出

11

因此,它在最左边的位中插入 0。

System.out.println(Integer.toBinaryString(-1>>>32))

输出

11111111111111111111111111111111

不应该是0吗?


答案 1

查看 http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.19

如果左侧操作数的升级类型为 int,则仅将右侧操作数的五个最低阶位用作平移距离。就好像右边的操作数受制于按位逻辑 AND 运算符 &(§15.22.1),掩码值0x1f (0b11111)。因此,实际使用的移动距离始终在 0 到 31(包括 0 到 31)的范围内。

它等效于和等效于,并且特别令人困惑,等效于-1 >>> 32-1 >>> 0-1 >>> 33-1 >>> 1-1 >>> -1-1 >>> 31


答案 2

推荐