Битовые операции в языке Си
Двоичная система счисления 4110 = 1010012
Типы данных Тип данных Размер в битах Диапазон допустимых значений char 8 от -128 до 127 unsigned char 8 от 0 до 255 short 16 от -32768 до 32767 unsigned short 16 от 0 до 65535 int 32 от -2147483648 до 2147483647 unsigned int 32 от 0 до 4294967295
Логические операции Выполняются над логическими значениями if ((x==2) || ((x%15==4) && !f(x))){… && - конъюнкция || - дизъюнкция ! - отрицание
Побитовые операции Выполняются над числами поразрядно 1. Унарные операции действия над одним элементом(операндом). 2. Бинарные действия над двумя элементами.
Побитовое НЕ unsigned char x = 41, y = ~x; printf("%d", y); //214 ~ 00101001 11010110
Побитовое И unsigned char x = 41&179; printf("%d", x); //33 & 00101001 10110011 00100001
Побитовое ИЛИ unsigned char x = 41|179; printf("%d", x); //187 | 00101001 10110011 1011
Побитовое исключающее ИЛИ unsigned char x = 41^179; printf("%d", x); //154 ^ 00101001 10110011010
Побитовый сдвиг влево unsigned char x = 109<<2; printf("%d", x); //180 <<2 0110110100
Побитовый сдвиг вправо unsigned char x = 109>>1; printf("%d", x); //54 >>1 01101101 00110110
Взятие бита int get. Bit(int x, int pos) { if(x&(1<<pos) > 0) return 1; else return 0; }
Взятие бита x&(1<<pos) get. Bit(41, 3); //41&(1<<3) 41=001010012 (1<<3)=000010002 41&(1<<3)=000010002
Включение бита int set. Bit(int x, int pos) { return x|(1<<pos); }
Включение бита x|(1<<pos) set. Bit(41, 4); //41|(1<<4) 41=001010012 (1<<4)=000100002 41|(1<<4)=001110012
Выключение бита int unset. Bit(int x, int pos) { return set. Bit(x, pos)^(1<<pos); }
Выключение бита unset. Bit(41, 4); 41=001010012 41|(1<<4)=001110012 (1<<4)=000100002 ^=001010012
Выключение последних N бит int unset. NBits(int x, int N) { return (x>>N)<<N; }
Выключение последних N бит unset. NBits(41, 3); 41=001010012 41>>3=000001012 (41>>3)<<3=001010002
Проверка числа на степень 2 int is 2 N(int x) { if(x&(x-1)==0) return 1; else return 0; }
Проверка числа на степень 2 ? ? ? 100002 – 1 = = ? ? ? 011112
Взятие числа по модулю int mod 2 N(int x, int N) { return x&((1<<N)-1); } N 2
Взятие числа по модулю N 2 x&((1<<N)-1) mod 2 N(41, 3); 1<<3=000010002 (1<<3)-1=000001112 41=001010012 &=000000012
Нахождение младшего бита х & ~(х - 1)
Подсчет количества битов Для этого : В цикл удаляем младший бит: х &= x - 1. int count. Ones(int x){ int k = 0; while (x != 0){ k++; x &= x - 1; } return k; }
Перебор всех подмножеств Пусть mask – маска некоторого множества S , тогда все подмножества S будут числами меньшими mask. Пусть х – подмножество маски mask, отнимем от него 1, (что получится? ) как оставить включенными в х то что было в mask ? x = (x - 1) & mask.
Перебор всех подмножеств for ( x = (mask – 1) & mask; x > 0; x = (x - 1) & mask ){ … }