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