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

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

我正在用 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/

相关文章:

java - 设置默认 Java 字符编码

java - 属性文件中的逗号分隔列表作为 Spring Bean 中的构造函数参数

c++ - C++ 中哪种递增方法更好?

c - 如何在 C 中将 32 位整数的位模式存储在 32 长度的 0 和 1 字符串中

javascript - 与 0b 的按位或运算将给定数字转换为负数

objective-c - 字段打包形成一个字节

TableView 中的 JavaFX 格式 SimpleLongProperty

java - 装饰器模式和@Inject

c++ - 分配的值比左值有更多的位

c - 需要帮助理解 C 中的左移运算符