Хитрости с битовыми операциями

Аватар Иван Бирюков
Отредактировано

75К открытий79К показов
Хитрости с битовыми операциями

Нашли и оформили подборку различных хитрых приёмов с битовыми операциями. С основами битовых операций также можно ознакомиться в нашей статье. Если вы знаете какие-то трюки, которые не вошли в этот список, делитесь ими в комментариях! 

Целые числа

Установка 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)
		

Примечание: можно использовать только латиницу.

Следите за новыми постами
Следите за новыми постами по любимым темам
75К открытий79К показов