Java уточнение левого сдвига - PullRequest
0 голосов
/ 11 марта 2020

Я не могу выяснить причину такого поведения. Я хочу сдвинуть влево на 8 бит значение байта OxAB. Тогда я хочу преобразовать это в длинный.

byte oneByte = (byte) 0xAB;
long converted = (oneByte & 0xFF) << 8;
System.out.println(converted);

В этом случае вывод равен 43776. Однако, если я изменю код на это:

byte oneByte = (byte) 0xAB;
long converted = (oneByte) << 8;
System.out.println(converted);

Выход изменится на -21760. У меня есть следующие вопросы:

  1. Какой тип данных 0xFF?
  2. Почему поразрядное И с 0xFF предотвращает расширение знака?

1 Ответ

0 голосов
/ 11 марта 2020
long converted = onebyte; // gives you -85

и если вы сдвинете его 8 раз влево, это даст вам ровно -21760, потому что при преобразовании в long самый левый бит используется в качестве знакового бита.

long converted = onebyte & 0xFF; //gives you 171

, а если Вы сдвигаете его 8 раз влево, и это дает вам 43776

, потому что при использовании побитового и байтового, короткого и char сначала преобразуются в int, а затем выполняется побитовая операция.

11111111111111111111111110101011 //byte 0xAB casted to int
00000000000000000000000011111111 //0xFF is an int literal
00000000000000000000000010101011 //bitwise and operation

после побитового и с 0xFF бит знака удаляется

...