逻辑右移会在 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 中的数学运算符永远不会对 char
、byte
和 short
进行运算,它们总是首先隐式提升为 int
。
我有一篇论文 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 中的数学运算符永远不会对 char
、byte
和 short
进行运算,它们总是首先隐式提升为 int
。