NPE при распаковке мыльного конверта

Поскольку никто не затронул тему, почему они полезны:

Я использую побитовые операции во время работы с флагами. Например, если вы хотите передать серию флагов в операцию (скажем, File.Open, с включенным режимом чтения и режимом записи), вы можете передать их как одно значение. Это достигается путем назначения каждого возможного флага собственным битом в битете (байте, коротком, int или длинном). Например:

 Read: 00000001
Write: 00000010

Итак, если вы хотите передать чтение и запись, вы должны пройти (READ | WRITE), который затем объединяет два в

00000011

, которые затем могут дешифровать на другом конце, например:

if ((flag & Read) != 0) { //...

, который проверяет

00000011 &
00000001

, который возвращает

00000001

, который не равен 0, поэтому флаг задает READ.

Вы можете использовать XOR для переключения различных бит. Я использовал это при использовании флага для указания направленных входов (вверх, вниз, влево, вправо). Например, если спрайт движется горизонтально, и я хочу, чтобы он развернулся:

     Up: 00000001
   Down: 00000010
   Left: 00000100
  Right: 00001000
Current: 00000100

Я просто XOR текущее значение с помощью (LEFT | RIGHT), который выключит LEFT и RIGHT, в этот случай.

Бит-сдвиг полезен в нескольких случаях.

x << y

совпадает с

x * 2y

< / blockquote>

, если вам нужно быстро умножить на мощность в два, но следите за переходом 1-битного в верхний бит - это делает число отрицательным, если оно не указано. Это также полезно при работе с различными размерами данных. Например, чтение целого числа из четырех байтов:

int val = (A << 24) | (B << 16) | (C << 8) | D;

Предполагая, что A является наиболее значимым байтом, а D - наименьшим. Это будет выглядеть так:

A = 01000000
B = 00000101
C = 00101011
D = 11100011
val = 01000000 00000101 00101011 11100011

Цвета часто сохраняются таким образом (с самым значительным байтом, который игнорируется или используется как Alpha):

A = 255 = 11111111
R = 21 = 00010101
G = 255 = 11111111
B = 0 = 00000000
Color = 11111111 00010101 11111111 00000000

Чтобы найти значения снова, просто сдвиньте биты вправо до тех пор, пока он не окажется внизу, затем замаскируйте оставшиеся разряды более высокого порядка:

Int Alpha = Color >> 24
Int Red = Color >> 16 & 0xFF
Int Green = Color >> 8 & 0xFF
Int Blue = Color & 0xFF

0xFF - это то же самое, что и 11111111. Так что, по сути, для Red вы бы сделайте это:

Color >> 16 = (filled in 00000000 00000000)11111111 00010101  (removed 11111111 00000000)
00000000 00000000 11111111 00010101 &
00000000 00000000 00000000 11111111 =
00000000 00000000 00000000 00010101 (The original value)
0
задан David 15 January 2019 в 15:00
поделиться