Побитовые операции

Материал из Викиконспекты
Версия от 18:41, 6 марта 2016; Penguinni (обсуждение | вклад) (Побитовые сдвиги)
Перейти к: навигация, поиск

ВНИМАНИЕ, СТАТЬЯ НАХОДИТСЯ В РАЗРАБОТКЕ

Побитовые операции — операции, производимые над цепочками битов. Выделяют два типа побитовых операций: логические операции и побитовые сдвиги.

Принцип работы

Логические побитовые операции

Битовые операторы И [math](AND, \&)[/math], ИЛИ [math](OR, \mid)[/math], НЕ [math](NOT, \sim)[/math] и исключающее ИЛИ [math](XOR,[/math] ^[math])[/math] используют те же таблицы истинности, что и их логические эквиваленты.

Побитовое И

Побитовое И используется для выключения битов. Любой бит, установленный в [math]0[/math], вызывает установку соответствующего бита результата также в [math]0[/math].

&
11001010
11100010
11000010

Побитовое ИЛИ

Побитовое ИЛИ используется для включения битов. Любой бит, установленный в [math]1[/math], вызывает установку соответствующего бита результата также в [math]1[/math].

|
11001010
11100010
11101010

Побитовое НЕ

Побитовое НЕ инвертирует состояние каждого бита исходной переменной.

~
11001010
00110101

Побитовое исключающее ИЛИ

Исключающее ИЛИ устанавливает значение бита результата в [math]1[/math], если значения в соответствующих битах исходных переменных различны.

^
11001010
11100010
00101000

Побитовые сдвиги

Операторы сдвига [math]\ll[/math] и [math]\gg[/math] сдвигают биты в переменной влево или вправо на указанное число. Сдвиг влево может применяться для умножения числа на два, сдвиг вправо — для деления. x = 7; //00000111

x << 1; //00001110

x << 5; //11000000

x >> 2; //00110000

C++ Visual Studio 15 Если выполняется сдвиг влево числа со знаком и при этом затрагивается бит знака, результат не определен. Результат сдвига вправо отрицательного числа со знаком зависит от реализации компилятора. Результат операции сдвига не определен, если число, на которое пользователь хочет сдвинуть биты имеет отрицательное значение или если оно больше или равно количеству битов в исходном числе.

  1. include <iostream>
  2. include <bitset>

using namespace std;

int main() {

   short short1 = 16384;    
   bitset<16> bitset1{short2};
   cout << bitset1 << endl;  // 0100000000000000 
short short3 = short1 << 1; bitset<16> bitset3{short3}; // 16384 left-shifted by 1 = -32768 cout << bitset3 << endl; // 100000000000000
short short4 = short1 << 14; bitset<16> bitset4{short4}; // 4 left-shifted by 14 = 0 cout << bitset4 << endl; // 000000000000000

}

Применение для решения задач

  • Проверка на то, является ли число степенью двойки:
    Если выражение [math](x\ \&\ (x - 1))[/math] равно нулю, то число [math]x[/math] является степенью двойки [math](x \not= 0)[/math].
  • Проверка на то, что в битовой записи числа нет двух единиц, идущих подряд:
    Если выражение [math](x\ \&\ (x \ll 1))[/math] равно нулю, то в битовой записи числа [math]x[/math] нет двух единиц, идущих подряд.
  • Номер младшего единичного бита:
    Число, полученное в результате операции [math]x\ \&\ (\sim x + 1)[/math] будет равно номеру младшего единичного бита в числе [math]x[/math].

Источники информации

Онлайн справочник программиста на С и С++