如何将整数拆分为2字节二进制?

时间:2009-11-14 22:32:56

标签: java

鉴于

private int width = 400;
private byte [] data = new byte [2];  

我想将整数“width”分成两个字节,并用高字节加载数据[0],用低字节加载数据[1]。

这是二进制值400 = 1 1001 0000 所以data [0]应该包含0000 0001 和数据[1]应包含1001 0000

7 个答案:

答案 0 :(得分:78)

使用简单的按位操作:

data[0] = (byte) (width & 0xFF);
data[1] = (byte) ((width >> 8) & 0xFF);

工作原理:

  • & 0xFF屏蔽除最低八位之外的所有内容。
  • >> 8通过将所有位向右移动8位来丢弃最低8位。
  • 转换为字节是必要的,因为这些按位操作适用于int并返回int,这是一种比byte更大的数据类型。这种情况是安全的,因为所有非零位都适合byte。有关详细信息,请参阅Conversions and Promotions

修改: Taylor L正确评论虽然>>在这种情况下有效,但如果将此代码推广到 4 ,则可能会产生错误的结果bytes(因为在Java中int是32位)。在这种情况下,最好使用>>>代替>>。有关详细信息,请参阅Java tutorial on Bitwise and Bit Shift Operators

答案 1 :(得分:11)

为了转换两个字节,最干净的解决方案是

data[0] = (byte) width;
data[1] = (byte) (width >>> 8);

为了将整数转换为四个字节,代码将是

data[0] = (byte) width;
data[1] = (byte) (width >>> 8);
data[2] = (byte) (width >>> 16);
data[3] = (byte) (width >>> 24);

是否>>无关紧要或>>>用于移位,由符号扩展创建的任何一个位都不会以结果字节结束。

另见this answer

答案 2 :(得分:4)

这应该为4字节int做你想要的。注意,它将低字节存储在偏移0处。我将把它作为练习留给读者根据需要订购它们。

public static byte[] intToBytes(int x) {
    byte[] bytes = new byte[4];

    for (int i = 0; x != 0; i++, x >>>= 8) {
        bytes[i] = (byte) (x & 0xFF);
    }

    return bytes;
}

答案 3 :(得分:1)

java中的整数是32位(= 4字节),你知道吗?

宽度& 0xff会给你第一个字节, 宽度和宽度0xff00>> 8会给你第二个等等。

答案 4 :(得分:0)

int width = 400;
byte [] data = new byte [2];

data[0] = (byte) ((width & 0xFF00) >> 8);
data[1] = (byte) (width & 0xFF);

for(int b = 0; b < 2; b++) {
    System.out.println("printing byte " + b);
    for(int i = 7; i >= 0; i--) {
        System.out.println(data[b] & 1);
        data[b] = (byte) (data[b] >> 1);
    }
}

答案 5 :(得分:0)

我建议您查看一下HeapByteBuffer的来源。它具有所有原始数据类型的转换代码。 (事实上​​你可以使用ByteBuffer;)

答案 6 :(得分:-1)

要获得高字节,请向右移8位,然后屏蔽顶部字节。同样,要使低字节只掩盖顶部字节。

data[0] = (width >> 8) & 0xff;
data[1] = width & 0xff;