Оскільки ніхто не торкався теми, чому вони корисні:
Я багато використовую побітові операції під час роботи з прапорами. Наприклад, якщо ви хочете передати серію прапорів до операції (скажімо, File.Open()у режимі читання та режимі запису включені обидва), ви можете передавати їх як єдине значення. Це досягається шляхом призначення кожному можливим прапором його власного біта в бітовому наборі (байт, короткий, int або довгий). Наприклад:
Read: 00000001
Write: 00000010
Отже, якщо ви хочете передати читання та запис, ви передасте (ЧИТАТИ | ЗАПИСЬ), який потім поєднує в собі два
00000011
Що потім можна розшифрувати на іншому кінці, як:
if ((flag & Read) != 0) { //...
який перевіряє
00000011 &
00000001
який повертається
00000001
що не дорівнює 0, тому прапор дійсно вказує ЧИТАТИ
Ви можете використовувати XOR для перемикання різних бітів. Я використовував це під час використання прапора для введення спрямованих входів (вгору, вниз, вліво, вправо). Наприклад, якщо спрайт рухається горизонтально, і я хочу, щоб він обернувся:
Up: 00000001
Down: 00000010
Left: 00000100
Right: 00001000
Current: 00000100
Я просто XOR поточне значення з (ВЛІВО | ВПРАВО), яке буде вимикати ВЛЕВО та ВПРАВО, в цьому випадку.
Зміна бітів корисна в декількох випадках.
x << y
те саме, що
х * 2 у
якщо вам потрібно швидко помножити на потужність дві, але стежте за переміщенням 1 біта у верхній біт - це робить число від’ємним, якщо воно не підписане. Це також корисно при роботі з різними розмірами даних. Наприклад, зчитування цілого числа з чотирьох байтів:
int val = (A << 24) | (B << 16) | (C << 8) | D;
Якщо припустити, що А - найзначніший байт, а D - найменший. Це закінчиться так:
A = 01000000
B = 00000101
C = 00101011
D = 11100011
val = 01000000 00000101 00101011 11100011
Кольори часто зберігаються таким чином (найзначніший байт або ігнорується, або використовується як Альфа):
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)