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

时间:2016-01-30 22:19:10

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

我正在用Java编写左移算法并且已经手动进行了一些左移计算。所有这些数字都输入为 byte ,btw。

我们假设我使用的是从-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正在抛出一个错误:精度错误丢失&#34;这也是我的问题。 谢谢!

1 个答案:

答案 0 :(得分:1)

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

关于你的问题:

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

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

<< 8

而且,如果你移出所有的位(0 0 0 0 0 0 0 0 = 0 ),你也会得到相同的值:

CREATE TABLE users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name VARCHAR NOT NULL,
    hair_color VARCHAR NOT NULL DEFAULT 'Green'
)

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

我希望能回答你的问题。