我正在用 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 抛出“错误:精度丢失错误”,这也引发了我的问题。 谢谢!
最佳答案
这个问题以及更多与转换相关的问题已经在 SO 问题 here 中进行了深入讨论。 。它还解释了为什么在使用有符号表达式时您的位计数不同。
关于你的问题:
您遇到的来自不同源值的相同值问题是由于您通过左移字中的位而丢弃了信息。在这两种情况下,以前与数字相关的信息携带位之一已成为符号位。
如果您将 -16 仅移动三位,您甚至会得到一个正数:
0 1 1 1 1 0 0 0 = 120
而且,如果您移出所有位 ( << 8
),您也将得到相同的值:
0 0 0 0 0 0 0 0 = 0
因此,您确实可以通过移动不同值的位来得出相同的数字。
我希望这能回答您的问题。
关于java - Java 中的按位左移产生相同的值......?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35107878/