0

バイト配列に数値の2の補数表現があり、それを拡張してより大きなバイト配列を使用したいと思います。byte[](sから2の補数を得ることができますBigInteger

したがって、私の新しいバイト配列は同じ符号ビット(つまり最上位ビット)を持っている必要があり、それから他のすべてがシフトされます。

それで:

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

私は正しい方向に進んでいますか?頭を動かすのに問題があります。バイト長の16進リテラルが機能します。または、16進リテラルのサイズをintサイズにする必要がありますか?もしそうなら、私は自分のすべてをキャストする必要があります。

そうです:

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

同等ですか?

4

1 に答える 1

1

ステップ1:符号ビット(つまり、最上位ビット)を保存します。
ステップ2:新しいパディングビットは符号ビットと同じである必要があります。例:

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

正の値の場合も同じです。

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

ビット単位の演算を実行する場合、バイトはintにプロモートされることに注意してください。したがって、パディングバイトは符号に応じて00hまたはFFhになります。残りのバイトは元のバイトと同じです。

符号は次のように決定できます。

//If the MSB were raw[0]:
boolean isNegative = false;
if(raw[0] & 0x80 != 0){
      isNegative = true;
}
于 2011-11-23T11:02:47.700 に答える