изменение размера дополнения байта [] до двух представляет целое число - PullRequest
0 голосов
/ 23 ноября 2011

У меня есть двоичное представление числа в байтовом массиве, и я хочу расширить его, чтобы использовать больший байтовый массив. (Вы можете получить два дополнения byte[] из 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);
}

Я на правильном пути? У меня возникли проблемы с тем, чтобы заставить себя думать, шестнадцатеричные литералы длины байта работают. Или мои шестнадцатеричные литералы должны иметь размер int? Если так, то мне придется бросить все.

также:

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

Эквивалент?

1 Ответ

1 голос
/ 23 ноября 2011

Шаг 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...