Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将整数拆分为2字节二进制?_Java - Fatal编程技术网

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

Java 如何将整数拆分为2字节二进制?,java,Java,给定 我想将整数“width”拆分为两个字节,并用高字节加载数据[0],用低字节加载数据[1] 这是二进制值400=110010000 所以数据[0]应该包含0000 0001 和数据[1]应包含10010000,使用简单的位运算: private int width = 400; private byte [] data = new byte [2]; 工作原理: &0xFF屏蔽除最低八位之外的所有位 >8通过将所有位向右移动8位来丢弃最低的8位 强制转换为字节是必要的,因为这些按位操

给定

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

这是二进制值400=110010000 所以数据[0]应该包含0000 0001
和数据[1]应包含10010000,使用简单的位运算:

private int width = 400;
private byte [] data = new byte [2];  
工作原理:

  • &0xFF
    屏蔽除最低八位之外的所有位
  • >8
    通过将所有位向右移动8位来丢弃最低的8位
  • 强制转换为字节是必要的,因为这些按位操作处理
    int
    并返回
    int
    ,这是比
    byte
    更大的数据类型。这种情况是安全的,因为所有非零位都将放入
    字节中。有关详细信息,请参阅
Edit:正确地指出,虽然
>
在这种情况下有效,但如果将此代码概括为四个字节,则可能会产生不正确的结果(因为在Java中,
int
是32位)。在这种情况下,最好使用
>>
而不是
>
。有关更多信息,请参阅java中的.p>整数是32位(=4字节),您知道吗

width&0xff将为您提供第一个字节,
width&0xff00>>8将为您提供第二个字节,以此类推。

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

data[0] = (byte) (width & 0xFF);
data[1] = (byte) ((width >> 8) & 0xFF);
int-width=400;
字节[]数据=新字节[2];
数据[0]=(字节)((宽度&0xFF00)>>8);
数据[1]=(字节)(宽度和0xFF);
对于(int b=0;b<2;b++){
System.out.println(“打印字节”+b);
对于(int i=7;i>=0;i--){
System.out.println(数据[b]&1);
数据[b]=(字节)(数据[b]>>1);
}
}

这应该满足4字节int的要求。注意,它将低位字节存储在偏移量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);
    }
}

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

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;
}
将整数转换为四个字节的代码是

data[0] = (byte) width;
data[1] = (byte) (width >>> 8);
无论>>还是>>>用于移位,由符号扩展创建的任何一个位都不会在结果字节中结束


另请参见。

我建议您查看HeapByteBuffer的源代码。它具有所有基本数据类型的转换代码。(事实上,您可以使用ByteBuffer;)

>可能不是您想要的移位时不带符号位,因此如果要捕获所有4个字节,在本例中可能更好。如果我执行“新字节[]{width&0xFF,(width>>8)&0xFF}”,编译器会说“可能会丢失精度要求的byte found int”@Kevin:我看到我忘记转换到
byte
。会更新答案。@Taylor:会查出来的,但是为什么Stephan的代码不起作用?你不需要面具,演员会把多余的部分剪掉。无论您使用>>还是>>>,由于符号扩展而产生的符号都将被切断。虽然我会考虑更好的风格。道歉-试图说明这个原则,但你说得很对。
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);