Cheatography
https://cheatography.com
На битовых операциях можно сделать очень много всего интересного, и работать оно будет очень быстро и занимать мало места. Огромный список битовых трюков и хаков можно посмотреть в этой статье [https://graphics.stanford.edu/~seander/bithacks.html] , их там очень много и все с примерами.
Целые
Установка nго бита |
|
Выключение nго бита |
|
нверсия nго бита |
|
Округление вниз |
n >> 0 5.7812 >> 0
// вернёт 5 |
Умножение на 2 |
|
Деление на 2 |
|
Умножение на mую степень двойки |
|
Деление на mую степень двойки |
|
Проверка на чётность (кратность 2) |
|
Максимум из двух |
b & ((a-b) >> 31) | a & (~(a-b) >> 31);
|
Минимум из двух |
a & ((a-b) >> 31) | b & (~(a-b) >> 31);
|
Проверка на одинаковый знак |
|
Смена знака |
i = ~i + 1; // or i = (i ^ -1) + 1; // i = -i |
Вернёт 2n |
|
Является ли число степенью 2 |
|
Остаток от деления на 2n на m |
|
Среднее арифметическое |
(x + y) >> 1; ((x ^ y) >> 1) + (x & y);
|
Получить mый бит из n (от младшего к старшему) |
|
Получить mый бит из n (от старшего к младшему) |
|
Проверить включен ли nый бит |
`if (x & (1<<n)) { n-th bit is set } else { n-th bit is not set }
|
Выделение самого правого включенного бита |
|
Выделение самого правого выключенного бита |
|
Выделение правого включенного бита |
|
Выделение правого выключенного бита |
|
n + 1 |
|
n – 1 |
|
Получение отрицательного значения |
|
if (x == a) x = b; if (x == b) x = a; |
|
Поменять смежные биты |
((n & 10101010) >> 1) | ((n & 01010101) << 1)
|
Different rightmost bit of numbers m & n |
(n^m)&-(n^m)
// returns 2x where x is the position of the different bit (0 based) |
Common rightmost bit of numbers m & n |
~(n^m)&(n^m)+1
// returns 2x where x is the position of the common bit (0 based) |
|
|
Целые
Округление до ближайшей степени двойки |
unsigned int v; // работает только с 32 битными числами 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 maxInt = -1u >> 1; |
Получение минимального целого |
int minInt = 1 << 31; int minInt = 1 << -1; |
Получение максимального long |
long maxLong = ((long)1 << 127) - 1;
|
Остаток от деления |
n & 0b1; // на 2 n & 0b11; // на 4 n & 0b111; // на 8 И так далее |
Проверка равенства |
(a^b) == 0; // a == b !(a^b) // использовать внутри if() |
Обмен значениями |
//version 1 a ^= b; b ^= a; a ^= b; |
//version 2 a = a ^ b ^ (b = a) |
Получение абсолютного значения |
//version 1 x < 0 ? -x : x; |
//version 2 (x ^ (x >> 31)) - (x >> 31); |
Строки
Конвертировать в нижний регистр` |
(x | ' ') Пример: ('a' | ' ') => 'a' ; ('A' | ' ') => 'a'
|
Конвертировать в верхний регистр |
(x & '_') Пример: ('a' & '_') => 'A' ; ('A' & '_') => 'A'
|
Инвертировать регистр |
(x ^ ' ') Пример: ('a' ^ ' ') => 'A' ; ('A' ^ ' ') => 'a'
|
Позиция буквы в алфавите (англ) |
(x & "\x1F") Пример: ('a' & "\x1F") => 1 ; ('B' & "\x1F") => 2
|
Позиция большой буквы в алфавите (англ) |
(x & '?') или (x ^ '@') Пример: ('C' & '?') => 3 ; ('Z' ^ '@') => 26
|
Позиция строчной буквы в алфавите (англ) |
(x ^ ' ') Пример:
('d' ^ ' ') => 4 ; ('x' ^ '
') => 24` |
|
|
Десятичные дроби
Примечание: хаки с float могут не работать на Ардуино! Разбить float в массив бит (unsigned uint32_t) |
#include <stdint.h> typedef union {float flt; uint32_t bits} lens_t; uint32_t f2i(float x) { return ((lens_t) {.flt = x}).bits; } |
Вернуть массив бит обратно в float |
float i2f(uint32_t x) { return ((lens_t) {.bits = x}).flt; } |
Быстрый обратный квадратный корень |
return i2f(0x5f3759df - f2i(x) / 2);
|
Быстрый nый корень из целого числа |
float root(float x, int n) { #DEFINE MAN_MASK 0x7fffff #DEFINE EXP_MASK 0x7f800000 #DEFINE EXP_BIAS 0x3f800000 uint32_t bits = f2i(x); uint32_t man = bits & MAN_MASK; uint32_t exp = (bits & EXP_MASK) - EXP_BIAS; return i2f((man + man / n) | ((EXP_BIAS + exp / n) & EXP_MASK)); } |
Быстрая степень |
return i2f((1 - exp) (0x3f800000 - 0x5c416) + f2i(x) exp) |
Быстрый натуральный логарифм |
#DEFINE EPSILON 1.1920928955078125e-07 #DEFINE LOG2 0.6931471805599453 return (f2i(x) - (0x3f800000 - 0x66774)) EPSILON LOG2 |
Быстрая экспонента |
return i2f(0x3f800000 + (uint32_t)(x * (0x800000 + 0x38aa22))) |
Примечание: хаки с float могут не работать на Ардуино! Разбить float в массив бит (unsigned uint32_t)
Другое
Быстрая конвертация цвета R5G5B5 в R8G8B8 |
R8 = (R5 << 3) | (R5 >> 2) |
G8 = (R5 << 3) | (R5 >> 2) |
B8 = (R5 << 3) | (R5 >> 2) |
Приоритет операций
Чтобы не плодить скобки, нужно знать приоритет операций |
:: |
++ |
-- |
() |
[] |
. |
-> |
++ |
-- |
+ |
- |
! |
~ |
(type) |
* |
& |
sizeof |
new, new[] |
delete, delete[] |
.* |
->* |
* |
/ |
% |
+ |
- |
<< |
>> |
< |
<= |
> |
>= |
== |
!= |
& |
^ |
| |
&& |
|| |
?: |
= |
+= |
-= |
*= |
/= |
%= |
<<= |
>>= |
&= |
^= |
|= |
Чтобы не плодить скобки, нужно знать приоритет операций
Приоритет операций
Чтобы не плодить скобки, нужно знать приоритет операций. В C++ он такой: |
Приоритет операций |
:: ++ -- () [] . -> ++ -- + - ! (type) * & sizeof new, new[] delete, delete[] .* ->* * / % + - << >> < <= > >= == != & ^ | && || ?: = += -= *= /= %= <<= >>= &= ^= |=:: ++ -- () [] . -> ++ -- + - ! (type) * & sizeof new, new[] delete, delete[] .* ->* * / % + - << >> < <= > >= == != & ^ | && || ?: = += -= *= /= %= <<= >>= &= ^= |= |
|
Created By
Metadata
Comments
No comments yet. Add yours below!
Add a Comment
Related Cheat Sheets
More Cheat Sheets by arest