Java 中的按位左移产生相同的值...?

bitwise left shift in Java produces the same values...?

我正在 Java 中编写左移算法,并且一直在手工进行一些左移计算。所有这些数字都输入为 byte,顺便说一句。

假设我正在处理从 -128 到 127 的 8 位整数。

然后根据我的计算:

(-113 << 4) == (-65 << 4) == -16

因为

-113 == 1 0 0 0 1 1 1 1 
-113 << 4 == 1 1 1 1 0 0 0 0 == -16

但也是

-65 == 1 0 1 1 1 1 1 1
-65 << 4  == 1 1 1 1 0 0 0 0 == -16

所以-113 左移 4 和 -65 左移 4 结果相同?难道不是所有的左移操作都会产生唯一的值吗?或者我有这个权利吗?

编辑:

我在 Java 工作,我所有的数字都是字节,JVM 抛出一个 "error: loss of precision error",这也是我提出问题的原因。 谢谢!

SO 问题 here 中深入讨论了这个问题以及更多与移动相关的问题。它还解释了为什么在使用带符号的表达式时您的位计数不同。

关于您的问题:

您遇到的来自不同源值的相同值 问题是因为您通过左移字中的位来丢弃信息。在这两种情况下,以前与数字相关的信息携带位之一都变成了符号位。

如果你只将 -16 移动三位,你甚至会得到一个正数:

0 1 1 1 1 0 0 0 = 120

而且,如果您移出所有位 (<< 8),您最终也会得到相同的值:

0 0 0 0 0 0 0 0 = 0

所以你确实可以通过移动不同值的位来得出相同的数字。

希望这能回答您的问题。