【问题标题】:resizing a byte[] two's complement represented integer调整字节 [] 二进制补码表示的整数
【发布时间】:2011-11-23 10:35:21
【问题描述】:

我有一个数字的二进制补码表示,在一个字节数组中,我想扩展它以使用更大的字节数组。 (可以从BigIntegers 中得到补码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)

等价物?

【问题讨论】:

  • 你可能想重新命名你的帖子,因为“字节抨击”对我来说意义不大。
  • 当然,Bytebashing(或者更常见的bit bashing)是指修改或与componany字节(或更常见的位)中的值交互

标签: java bytearray byte bit-manipulation twos-complement


【解决方案1】:

第 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;
}

【讨论】:

  • 您对符号位的权利应该用于填充,但我遇到的问题是如何恢复符号位?
  • 很酷,谢谢。所以你可以将字节表示为十六进制文字,很酷。我的另一个选择是 isNegitive == (raw[0]>>7 ==1) 我猜
  • 关于字节作为十六进制文字,我不知道你的意思,但例如0x80 是一个int。
  • 我的意思是,我可以在 raw[0] 和 0x80 之间进行操作吗?如果 0x80 是一个 int 则它的类型与 raw[0] 不同
  • 您的操作应该是(raw[0] >>> 7) == 1,因为>> 操作符是有符号移位并保持符号位。好吧,实际上,由于 raw[0] 首先被提升为 int 然后移位,所以你必须这样做 ((raw[0] >>> 7) & 1) == 1
猜你喜欢
  • 2015-06-08
  • 2011-12-18
  • 2019-01-05
  • 2021-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-26
  • 2013-03-28
相关资源
最近更新 更多