【问题标题】:bitwise left shift in Java produces the same values...?Java中的按位左移产生相同的值......?
【发布时间】:2016-01-30 22:19:09
【问题描述】:

我正在用 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 抛出“错误:精度损失错误”,这也是引发我的问题的原因。 谢谢!

【问题讨论】:

  • 问题不清楚。你想弄清楚什么?
  • 这就是它的工作原理。 “操作数中的每一位都只是简单地移动了给定数量的位位置,并且空位位置被填充,通常用零填充(与循环移位相反)。” en.wikipedia.org/wiki/Logical_shift
  • 由于这些是负值,您可能希望保留符号位,但正如 Amit 所说,您要做什么并不完全清楚。
  • 已编辑。是不是更清楚了?
  • @M.M 好吧,我正在使用 Java。我的代码如下: byte

标签: java bit-manipulation bitwise-operators bit-shift


【解决方案1】:

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

关于你的问题:

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

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

0 1 1 1 1 0 0 0 = 120

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

0 0 0 0 0 0 0 0 = 0

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

我希望这能回答你的问题。

【讨论】:

  • 谢谢,Jan. 有道理!
  • 很高兴有帮助。如果您想要您描述的行为(即,不丢失信息并始终获得不同的数字),您可能希望查看 rotation 而不是 shift。
猜你喜欢
  • 1970-01-01
  • 2018-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多