«1. Обзор

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

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

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, мы необходимо преобразовать его в байт, потому что диапазон типа данных byte составляет от -128 до 127.

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

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

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

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

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

4. Извлечение цветовых координат RGBA с помощью \u0026 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, и мы хотим извлечь значение для каждого параметра.

Как мы знаем, операция \u003e\u003e сдвигает биты вправо. Поэтому, когда мы делаем (10000000 00000000 \u003e\u003e 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. Заключение

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

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