【发布时间】:2009-11-14 22:32:56
【问题描述】:
给定
private int width = 400;
private byte [] data = new byte [2];
我想把整数“宽度”分成两个字节,用高字节加载 data[0],用低字节加载 data[1]。
即二进制值 400 = 1 1001 0000 所以 data[0] 应该包含 0000 0001 和 data[1] 应该包含 1001 0000
【问题讨论】:
标签: java
给定
private int width = 400;
private byte [] data = new byte [2];
我想把整数“宽度”分成两个字节,用高字节加载 data[0],用低字节加载 data[1]。
即二进制值 400 = 1 1001 0000 所以 data[0] 应该包含 0000 0001 和 data[1] 应该包含 1001 0000
【问题讨论】:
标签: java
使用简单的按位运算:
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 个字节,它可能会产生不正确的结果(因为在Java int 是 32 位)。在这种情况下,最好使用>>> 而不是>>。如需更多信息,请参阅Java tutorial on Bitwise and Bit Shift Operators。
【讨论】:
byte。将更新答案。
要转换两个字节,最干净的解决方案是
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。
【讨论】:
对于 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;
}
【讨论】:
整数在 java 中是 32 位(=4 字节),你知道吗?
width & 0xff 会给你第一个字节, width & 0xff00 >> 8 会给你第二个,等等。
【讨论】:
要获取高字节,请右移 8 位,然后屏蔽顶部字节。同样,要获取低字节,只需屏蔽顶部字节即可。
data[0] = (width >> 8) & 0xff;
data[1] = width & 0xff;
【讨论】:
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);
}
}
【讨论】:
我建议你看看 HeapByteBuffer 的源代码。它具有所有原始数据类型的转换代码。 (事实上你可以只使用一个 ByteBuffer ;)
【讨论】: