РЕДАКТИРОВАТЬ: Хорошо, я оставляю нижнюю часть для потомков ...
Если x
равен int
, то это довольно просто: x << 8
будет иметь то же значение, что и x & 0xff
тогда и только тогда, когда ни один из «средних» 16 битов не установлен:
- Старшие 8 бит
x
будут считаться неактуальными с помощью левого сдвига - Нижние 8биты
x
сохраняются с помощью маскировки
Если имеется любой из набора "средних" 16 битов, то x & 0xff
будет отличаться от x
вбит, который все еще сохраняется при сдвиге, поэтому результаты будут другими.
Я не понимаю, почему вы ожидаете, что они всегда будут давать одинаковые результаты ...
Я собираюсь предположить, что тип x
равен byte
, и что он на самом деле отрицательный.
Операция сдвига не определена для byte
, поэтому сначала выполняется преобразование в int
... и это может измениться в зависимости от того, есть ли у вас маска.
Итак, давайте рассмотрим случай, когда x
равно -1.Тогда (int) x
равно также -1 - т.е. битовая комбинация равна 1 с.Сдвиньте влево на 8 бит, и вы получите битовую комбинацию 24 1 с, за которой следуют 8 0:
11111111111111111111111100000000 = -256
Теперь рассмотрим вторую строку кода - для этого требуется x & 0xff
, который будет принимать тольконижние 8 битов повышенного значения x
- то есть 255. Вы сдвигаете влево на 8 битов, и в итоге получается 16 0 с, 8 1 с, затем 8 0:
00000000000000001111111100000000 = 65280