java - 为什么我的 int 没有正确返回?

标签 java bit-manipulation

所以,我有一个相当简单的方法

byte[] mem;
int pc;

private int d16() {
    return (((int) this.mem[pc++]) | ((int) this.mem[pc++] << 8) & 0x00FFFF);
}

如果我在返回之前打印该值,并且 LSB(小端形式)是 0xFF,那么我会得到 0xffcd 例如。但是,如果我在返回后打印返回值(我调用该方法的地方),我会得到 0xffffffcd .. 这是一个非常不同的值。

我的软解决方案是

int a = d16() & 0xFFFF;

但我认为我不必这样做。

问题

为什么我的位掩码没有跟随返回值通过返回?

最佳答案

这是因为运算符优先级:根据 this precedence table for Java& 的优先级高于 | 。尽管有所有括号,但两个 OR (|) 操作数周围没有括号。这意味着这首先发生:

((int) this.mem[pc++] << 8) & 0x00FFFF

然后将该值与第一个值进行或运算,((int) this.mem[pc++])。当这些值转换为 int 时,很可能在应用位掩码之后发生符号扩展。这可以解释0xffffffcd返回值。

您需要在 | 操作数两边放置括号,以确保先进行 OR 运算,然后再进行与位掩码的 AND 运算。

//       v                                                      v
return ( ( ((int) this.mem[pc++]) | ((int) this.mem[pc++] << 8) ) & 0x00FFFF);

关于java - 为什么我的 int 没有正确返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25316042/

相关文章:

java - 使用 JUnit 在多线程环境中测试方法行为?

java - Java-selenium 上的 StaleElementReferenceException 错误

java - 使用 gradle 创建 jar,导入类时无法看到同一包中的其他类

java - 逆变方法参数类型

java - 如何设计单元测试类

Mysql二分查找

c++ - 按位操作的问题

java - Python 和 Java 中的位操作

python - 如何反转按位或运算?

c# - 还有另一种测试枚举位域的方法吗?