Java OR运营商疯狂

时间:2015-09-17 13:23:10

标签: java operator-keyword

有可能在接下来的几天感到羞耻......请解释以下内容 我需要对带有字节的整数进行算术运算。

int a = 0x0100;
byte b = (byte)0xff;
int c = a | b;

我希望c为0x100 | 0xff = 0x1ff = 511 但它是0xffffffff = -1 为什么呢?

6 个答案:

答案 0 :(得分:4)

b-1。 执行a | b后,b会提升为仍为-1的整数。

15.22.1. Integer Bitwise Operators &, ^, and |

When both operands of an operator &, ^, or |
    are of a type that is convertible (§5.1.8) to a primitive integral type,
binary numeric promotion is first performed on the operands (§5.6.2).

因此,a | b被评估为a | -1

final int a = 0x0100;
final int b = 0xFF;
final int c = a | b;

我不确定你想要做什么,但是。

How could I accomplish adding 8 bits to the end of a int value in simple steps?
int appendDummyOnes(final int value, final int size) {
    return (value << size) | (-1 >>> (Integer.SIZE - size));
}

int remarkDummyOnes(final int value, final int size) {
    return value | (-1 >>> (Integer.SIZE - size));
}

答案 1 :(得分:1)

这有效:

int c = a | (b & 0xff);

答案 2 :(得分:0)

在您的代码中

int c = a | b;

字节b扩展为int并保持值(对于signed int中的此值为-1)。 int中的这个值是0xFFffFFff,所以在0x0100 |之后0xFFffFFff你有0xFFffFFff

正如Jin Kwon的回答所述 - 在当前情况下你应该使用整数。

答案 3 :(得分:0)

answer by Jin Kwon解释了保留行为的原因。但请注意,有一个简单的解决方案(除了在其他答案中提到的(b & 0xFF)):Java 8添加了一些处理无符号值的便捷方法。所以你可以简单地做

    int c = a | Byte.toUnsignedInt(b);

答案 4 :(得分:0)

我选择了这个代码。你的代码疯狂的原因是:

  

您使用的是1字节(8位)的整数(int)数据类型,但您正在处理2字节(16位)的数据。在这种情况下,MSB(第8位)被视为符号位,对于(-ve)为0,对于(+ ve)为1。

事实上,OR运算符并不是疯狂的,而是你的代码。你可以使用类似于下面的实现让你的代码运行得足够好:

import java.io.*;
import java.util.*;

class Lesson7{
    public static void main(String args[]){
        int a = 0x01;
        byte b = (byte)0x00;
        int c = a | b;
        System.out.println(c);
    }
}

答案 5 :(得分:0)

我已经测试了这个:

int a = 0x100;
int b = 0xff;
int c = a|b;
System.out.println(c);