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
所以你确实可以通过移动不同值的位来得出相同的数字。
希望这能回答您的问题。
我正在 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
所以你确实可以通过移动不同值的位来得出相同的数字。
希望这能回答您的问题。