Нашли и оформили подборку различных хитрых приёмов с битовыми операциями. С основами битовых операций также можно ознакомиться в нашей статье. Если вы знаете какие-то трюки, которые не вошли в этот список, делитесь ими в комментариях!
Целые числа
Установка n-ого бита
x | (1<<n)
Обнуление n-ого бита
x & ~(1<<n)
Переключение n-ого бита
x ^ (1<<n)
Округление до следующей степени двойки
unsigned int v; //only works if v is 32 bit
v--;
v |= v >> 1;
v |= v >> 2;
v |= v >> 4;
v |= v >> 8;
v |= v >> 16;
v++;
Получение максимального целого
int maxInt = ~(1 << 31);
int maxInt = (1 << 31) - 1;
int maxInt = (1 << -1) - 1;
Получение минимального целого
int minInt = 1 << 31;
int minInt = 1 << -1;
Получение максимального long
long maxLong = ((long)1 << 127) - 1;
Умножение на 2
n << 1;
Деление на 2
n >> 1;
Умножение на m-тую степень 2
n << m;
Деление на m-тую степень 2
n >> m;
Проверка на равенство
На 35% быстрее, чем JS 🙂
(a^b) == 0; // a == b
Проверка на чётность
(n & 1) == 1;
Обмен значениями
a ^= b;
b ^= a;
a ^= b;
Модуль
//version 1
x < 0 ? -x : x;
//version 2
(x ^ (x >> 31)) - (x >> 31);
Максимум двух чисел
b & ((a-b) >> 31) | a & (~(a-b) >> 31);
Минимум двух чисел
a & ((a-b) >> 31) | b & (~(a-b) >> 31);
Проверка на одинаковый знак
(x ^ y) >= 0;
Смена знака
i = ~i + 1; // or
i = (i ^ -1) + 1; // i = -i
Вычисление 2^n
2 << (n-1);
Проверка на степень 2
n > 0 && (n & (n - 1)) == 0;
Остаток от деления 2^n на m
m & (n - 1);
Среднее арифметическое
(x + y) >> 1;
((x ^ y) >> 1) + (x & y);
Получение m-ого бита n (справа налево)
(n >> (m-1)) & 1;
Установка m-ого бита n (справа налево)
n & ~(1 << (m-1));
Проверка n-ого бита
if (x & (1<<n)) {
n-th bit is set
}
else {
n-th bit is not set
}
Выделение самой правой 1
x & (-x)
Выделение самого правого 0
~x & (x+1)
Смена самого правого 0 на 1
x | (x+1)
n+1
-~n
n-1
~-n
if (x==a) x=b; if (x==b) x=a;
x = a ^ b ^ x;
Строки
Преобразование буквы в строчную
OR by space => (x | ' ')
Result is always lowercase even if letter is already lowercase
eg. ('a' | ' ') => 'a' ; ('A' | ' ') => 'a'
Преобразование буквы в заглавную
AND by underline => (x & '_')
Result is always uppercase even if letter is already uppercase
eg. ('a' & '_') => 'A' ; ('A' & '_') => 'A'
Смена вида буквы
XOR by space => (x ^ ' ')
eg. ('a' ^ ' ') => 'A' ; ('A' ^ ' ') => 'a'
Номер буквы в алфавите
AND by chr(31)/binary('11111')/(hex('1F') => (x & "\x1F")
Result is in 1..26 range, letter case is not important
eg. ('a' & "\x1F") => 1 ; ('B' & "\x1F") => 2
Номер заглавной буквы в алфавите
AND by ? => (x & '?') or XOR by @ => (x ^ '@')
eg. ('C' & '?') => 3 ; ('Z' ^ '@') => 26
Номер строчной буквы в алфавите
XOR by backtick/chr(96)/binary('1100000')/hex('60') => (x ^ '`')
eg. ('d' ^ '`') => 4 ; ('x' ^ '`') => 25
Прочее
Быстрая смена цвета с R5G5B5 на R8G8B8
R8 = (R5 << 3) | (R5 >> 2)
G8 = (R5 << 3) | (R5 >> 2)
B8 = (R5 << 3) | (R5 >> 2)
Примечание: можно использовать только латиницу.
По материалам awesome-bits