逻辑右移会在 Java 中加 1 吗?

Does a logical right shift ever add a 1 in Java?

我有一篇论文 1111 1111 1111 xxxx 作为 (short)(Z>>>12) 的答案。提供给我们检查位操作答案的程序也将此答案提供给 (short) 输入。据我了解,只有算术移位(>>)对符号敏感。

编辑:

Z = -2009  (or 1111100000100111 in binary)

(short)(Z>>>12) = -1 (or 1111111111111111 in binary)

根据我的理解,这可能是一个骗局。

这是一个输出给定结果的程序:

short z = (short)0b1111_1000_0010_0111;  // -2009
System.out.println( (short)(z >>> 12) ); // prints -1

这是因为右移之前,short通过符号扩展被提升为int。这将用 1 填充上方 short 范围的 16 位。

换句话说:

// as a short
                    1111_1000_0010_0111
// sign extended to int
1111_1111_1111_1111_1111_1000_0010_0111
// shifted right 12
0000_0000_0000_1111_1111_1111_1111_1111
// cast back to short
                    1111_1111_1111_1111

如果你不想要符号扩展,你必须屏蔽:

System.out.println( (short)((z & 0xffff) >>> 12) );

Java 中的数学运算符永远不会对 charbyteshort 进行运算,它们总是首先隐式提升为 int