У меня есть следующий код Java:
byte value = 0xfe; // corresponds to -2 (signed) and 254 (unsigned)
int result = value & 0xff;
Результат - 254 при печати, но я понятия не имею, как работает этот код. Если &
оператор просто побитовый, то почему он не дает байта, а целого числа?
java
integer
byte
bitwise-and
Dagronlund
источник
источник
byte value = (byte) 0xfe;
Ответы:
Он устанавливает
result
(беззнаковое) значение, полученное в результате помещения 8 битvalue
в младшие 8 битresult
.Причина, по которой что-то подобное необходимо, заключается в том, что
byte
это подписанный тип в Java. Если вы только что написали:то
result
будет в конечном итоге со значениемff ff ff fe
вместо00 00 00 fe
. Еще одна тонкость заключается в том, что&
определяется для работы только соint
значениями 1 , поэтому происходит следующее:value
повышается доint
(ff ff ff fe
).0xff
являетсяint
буквальным (00 00 00 ff
).&
Наносится с получением желаемого значения дляresult
.(Дело в том, что преобразование в
int
происходит до применения&
оператора.)+1 Ну не совсем так.
&
Оператор работает наlong
значениях , а также, если один из операндов являетсяlong
. Но не дальшеbyte
. См. Спецификацию языка Java, разделы 15.22.1 и 5.6.2 .источник
0x
(или0X
) сообщает Java, что следующий за ним целочисленный литерал следует интерпретировать как шестнадцатеричный (основание 16). Java также поддерживает пустой0
префикс для восьмеричных литералов и префикс0b
(или0B
) для двоичных литералов. См. Спецификацию языка Java для получения дополнительной информации о целочисленных литералах.0x
или0b
само по себе (без каких-либо цифр) является недопустимым синтаксисом в Java.fe
в 8 битах, дополнение до двух соответствует десятичному значению −2. Чтобы сохранить значение,Integer.valueOf(byte)
необходимо произвестиff ff ff fe
(−2 в 32-битном формате, дополнение до двух), а не00 00 00 fe
(десятичное значение 254). Это преобразование (отbyte
значенияfe
кint
значениюff ff ff fe
) известно как расширение знака и является частью спецификации языка Java. Цельvalue & 0xff
состоит в том, чтобы отменить расширение знака (т. Е. Имитировать нулевое расширение, чего нет в Java).Из http://www.coderanch.com/t/236675/java-programmer-SCJP/certification/xff
Шестнадцатеричный литерал 0xFF равен int (255). Java представляет int как 32 бита. В двоичном формате это выглядит так:
Когда вы делаете немного мудрое И с этим значением (255) для любого числа, он будет замаскировать (сделать НУЛИ) все, кроме самых младших 8 бит числа (будет как есть).
& - это что-то вроде%, но не совсем .
А почему 0xff? это в ((степень 2) - 1). Все ((степень 2) - 1) (например, 7, 255 ...) будут вести себя примерно как оператор%.
Тогда
в двоичном формате 0 - это все нули, а 255 выглядит так:
И -1 выглядит так
Когда вы выполняете побитовое И для 0xFF и любого значения от 0 до 255, результат будет таким же, как и значение. И если какое-либо значение больше 255, результат будет в пределах 0-255.
Однако если вы это сделаете:
ты получаешь
00000000 00000000 00000000 11111111
, что НЕ равно исходному значению -1 (11111111
255 в десятичной системе).Проверьте, установлен ли какой-либо конкретный бит (1) или нет (0), затем
Установить (1) конкретный бит
ReSet (0) конкретный бит
XOR
Просто обратите внимание, что если вы выполните операцию XOR дважды, получится то же значение.
Еще одна логика с XOR:
Вышеизложенное полезно для замены двух переменных без температуры, как показано ниже.
ИЛИ
источник
Это помогает сократить количество кодов. Иногда он используется в значениях RGB, состоящих из 8 бит.
где 0xff означает 24 (0) и 8 (1), например
00000000 00000000 00000000 11111111
Это чаще всего наблюдается в случаях, например, при попытке преобразовать значения цвета из специального формата в стандартные значения RGB (длина которых составляет 8 бит).
Отличное объяснение см. Здесь
источник
В 32 битном формате системы шестнадцатеричное значение
0xff
представляет00000000000000000000000011111111
то есть255(15*16^1+15*16^0)
в десятичной системе . а побитовый оператор & маскирует те же самые 8 правых битов, что и в первом операнде.источник