gpt4 book ai didi

java - 调整 byte[] 二进制补码表示的整数的大小

转载 作者:行者123 更新时间:2023-12-01 15:39:49 25 4
gpt4 key购买 nike

我有一个数字的二进制补码表示形式,位于字节数组中,我想扩展它以使用更大的字节数组。(您可以从 BigInteger 中获取二进制补码 byte[])

所以我的新字节数组必须具有相同的符号位(即最高位)然后其他一切都发生了变化。

所以:

byte[] resize (byte[] raw, int len)
{
byte high = raw[0];

resized[0] = high & 0x80 //ie binary 1000 0000
raw[0] = high & 0x7F // 0111 1111
//causes a side effect but i don't care raw is a throw away value

byte[] resized = new byte[len];
system.ArrayCopy(raw,0,resized,len-raw.length, len);
}

我走在正确的道路上吗?我无法理解,字节长度十六进制文字可以工作。或者我的十六进制文字必须是 int 大小吗?如果是这样,我将不得不放弃我的一切。

所以是:

resized[0] = (byte) ((int)high & 0x8000)
raw[0] = (byte)((int)high & 0x7FFF)

等价?

最佳答案

第1步:保存符号位(即:最高有效位)
步骤2:新的填充位应与符号位相同。示例:

1 byte: 11110001 
2 bytes: 1111111111110001
8 bytes: 1111111111111111111111111111111111111111111111111111111111110001

对于正值是相同的:

1 byte: 00001111
2 bytes: 0000000000001111
8 bytes: 0000000000000000000000000000000000000000000000000000000000001111

请注意,执行按位运算时,字节会提升为整数。因此,根据符号,填充字节将为 00h 或 FFh。其余字节与原始字节相同。

符号可以确定如下:

//If the MSB were raw[0]:
boolean isNegative = false;
if(raw[0] & 0x80 != 0){
isNegative = true;
}

关于java - 调整 byte[] 二进制补码表示的整数的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8240704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com