Перейти к основному содержимому

Понимание значения & 0xff в Java

· 4 мин. чтения

Задача: Медиана двух отсортированных массивов

Даны два отсортированных массива размерами n и m. Найдите медиану слияния этих двух массивов.
Временная сложность решения должна быть O(log(m + n)) ...

ANDROMEDA

1. Обзор

0xff — это число, представленное в шестнадцатеричной системе счисления (основание 16). Он состоит из двух шестнадцатеричных чисел F. Как мы знаем, F в шестнадцатеричном формате эквивалентно 1111 в двоичной системе счисления. Итак, 0xff в двоичном коде — это 11111111.

В этой статье мы узнаем, как использовать значение 0xff . Кроме того, мы увидим, как представить его с помощью нескольких типов данных и как использовать его с оператором & . Наконец, мы рассмотрим некоторые преимущества, связанные с его использованием.

2. Представление 0xff различными типами данных

Java позволяет нам определять числа, интерпретируемые как шестнадцатеричные (основание 16), используя префикс 0x , за которым следует целочисленный литерал.

Значение 0xff эквивалентно 255 в десятичном формате без знака, -127 в десятичном формате со знаком и 11111111 в двоичном формате.

Итак, если мы определим переменную int со значением 0xff , поскольку Java представляет целые числа, используя 32 бита , значение 0xff равно 255 :

int x = 0xff;
assertEquals(255, x);

Однако, если мы определим байтовую переменную со значением 0xff , поскольку Java представляет байт с помощью 8 бит и поскольку байт является типом данных со знаком , значение 0xff равно -1 :

byte y = (byte) 0xff;
assertEquals(-1, y);

Как мы видим, когда мы определяем байтовую переменную со значением 0xff , нам нужно преобразовать ее в байт , потому что диапазон типа данных байта составляет от -128 до 127 .

3. Обычное использование операции & 0xff

Оператор & выполняет побитовую операцию И. Выход побитового И равен 1, если соответствующие биты двух операндов равны 1. С другой стороны, если любой из битов операндов равен 0, то результат соответствующего бита оценивается как 0.

Так как 0xff имеет восемь единиц в последних 8 битах , это делает его элементом идентификации для операции побитового И. Итак, если мы применим операцию x & 0xff , она даст нам младшие 8 бит из x . Обратите внимание, что если число x меньше 255, оно останется прежним. В противном случае это будут младшие 8 бит от x .

В общем, операция &0xff предоставляет нам простой способ извлечь младшие 8 бит из числа . На самом деле мы можем использовать его для извлечения любых 8 битов, которые нам нужны, потому что мы можем сдвинуть вправо любой из 8 битов, которые мы хотим, чтобы они были младшими битами. Затем мы можем извлечь их, применив операцию & 0xff .

Давайте рассмотрим пример, чтобы более подробно объяснить некоторые преимущества использования & 0xff .

4. Извлечение цветовых координат RGBA с помощью & 0xff

Предположим, что у нас есть целое число x , хранящееся в 32 битах, которое представляет цвет в системе RGBA, что означает, что у него есть 8 битов для каждого параметра (R, G, B и A):

  • R = 16 (00010000 в двоичном формате)
  • G = 57 (00111001 в двоичном формате)
  • B = 168 (10101000 в двоичном формате)
  • A = 7 (00000111 в двоичном формате)

Таким образом, x в двоичном виде будет представлен как 00010000 00111001 10101000 00000111, что эквивалентно 272214023 в десятичном виде.

Теперь у нас есть значение x в десятичном формате, и мы хотим извлечь значение для каждого параметра.

Как мы знаем, операция >> сдвигает биты вправо. Поэтому, когда мы делаем (10000000 00000000 >> 8), это дает нам 10000000. В результате мы можем извлечь значение каждого параметра :

int rgba = 272214023;

int r = rgba >> 24 & 0xff;
assertEquals(16, r);

int g = rgba >> 16 & 0xff;
assertEquals(57, g);

int b = rgba >> 8 & 0xff;
assertEquals(168, b);

int a = rgba & 0xff;
assertEquals(7, a);

5. Вывод

В этом руководстве мы обсудили, как операция & 0xff эффективно разделяет переменную таким образом, что оставляет только значение в последних 8 битах и игнорирует остальные биты. Как мы видели, эта операция особенно полезна, когда мы сдвигаем переменную вправо и нам нужно извлечь сдвинутые биты.

Как всегда, код, представленный в этой статье, доступен на GitHub .