преобразовать байт в целое число в Java с помощью & и | - PullRequest
1 голос
/ 22 декабря 2019

Мне нужно сделать преобразование из 1 байта в целое число, используя & и |. Вывод после преобразования должен быть целым числом с этими байтами: (0xFF) (байт) (байт) (байт).

Например:Вход:

00000111  

Выход:

11111111000001110000011100000111

Мой код работает, если байт находится в диапазоне [0, 127]

int integer=7;
byte a=(byte)integer;
int b=(0xFF<<24)|(a<<16)|(a<<8)|(a);
System.out.println(Integer.toBinaryString(b));

Если байт находится в диапазоне [-128, -1], не работает

ввод:

10000000

Неверный вывод:

11111111111111111111111110000000

Ожидаемый вывод:

11111111100000001000000010000000

1 Ответ

1 голос
/ 22 декабря 2019

Это происходит потому, что при смещении a у вас остается 1 с на передней панели.

Например:

a<<16 дает вам 11111111100000000000000000000000но вы хотите 100000000000000000000000

a<<8 дает вам 11111111111111111000000000000000, но вы хотите 1000000000000000

Таким образом, нам нужно замаскировать те дополнительные 1, которые добавляются впередделать & 0xFF

Поэтому замените это

int b=(0xFF<<24)|(a<<16)|(a<<8)|(a);

на это

int b = (0xFF<<24)|((a & 0xFF)<<16)|((a & 0xFF)<<8)|(a & 0xFF);

Чтобы понять, почему мы видим1 спереди, вот отличное объяснение: Странное поведение, когда Java преобразует int в байт?

...