【问题标题】:Bitwise or not producing expected results按位或不产生预期结果
【发布时间】:2014-03-06 03:42:58
【问题描述】:

我有以下java代码:

public static void main(String []args){
    int a = 1;
    byte b = -14;
    int c = (a << 8) | b;

    System.out.println(c);
 }

产生:

-14

我原以为是 498。据我了解,移位后的 OR 操作将如下所示:1 0000 0000 | 1111 0010,我希望这会产生一个看起来像 0000 0001 1111 0010 的 int,其值为 498。显然,Java 以某种方式将字节扩展为 int c。谁能告诉我正确的方法来做到这一点?

我要做的是创建一个 int,其中最低有效字节为 b,第二个最低有效字节为 a。

【问题讨论】:

  • int c = ((a &lt;&lt; 8) | ~(~0 &lt;&lt; 8) &amp; b);。这会给你 498。

标签: java numbers int byte bit-manipulation


【解决方案1】:

如果您将所有内容都移到 8 位字节中,那么您已经完全移开了所有内容。与完全清零的字节进行 ORing 与加零或乘以 1 相同...

【讨论】:

  • 如果我将 a 初始化为 short,c 的计算结果仍为 -14。
  • 是的,我左移应该是正确的。查看修改。
  • System.out.println(a); a = a &lt;&lt; 8; System.out.println(a)?
【解决方案2】:

记住abyte。因此,当您执行 a &lt;&lt; 8 时,它不会向右移动 8 个位置,从而有效地将其变为 0。它将结果提升为 int。我建议将a 定义为int

更新:

int c = ((a

【讨论】:

  • 即使将 a 定义为 int 也会导致 -14。
  • 再想一想,它只会是-14。 b:11111111111111111111111111110010(a &lt;&lt; 8):100000000。所以,如果你是 OR 这个,你将有效地得到 b
  • 我看到这个解决方案适用于给定的情况。但是,我不相信它是一种很好的风格,因为没有人查看该代码会知道它的作用。所以这真的取决于程序员。我个人在接受的答案中使用了 ByteBuffer,但其他人可能会选择按位运算。显然它们更有效率。
【解决方案3】:

在 java 中使用位运算符不能轻松/很好地做到这一点。解决方案是使用 ByteBuffer。

ByteBuffer byteBuffer = ByteBuffer.allocate(4);
byteBuffer.put((byte)0);
byteBuffer.put((byte)0);
byteBuffer.put((byte)1);
byteBuffer.put((byte)-14);
byteBuffer.rewind();
int bodyLength = byteBuffer.getInt();
System.out.println(bodyLength);

上面的代码会打印498。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多