Поскольку никто не затронул тему, почему они полезны:
Я использую побитовые операции во время работы с флагами. Например, если вы хотите передать серию флагов в операцию (скажем, 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)