Поразрядная операция И

По отношению ко второму операнду (маске) логическая операция И сохраняет (выделяет) те биты первого операнда, которые соответствуют единичным битам маски, и безусловно сбрасывает в 0 те биты результата, которые соответствуют нулевым битам маски. Операция называется - выделение битов по маске:

хххххххх – операнд

00111000 – маска

00ххх000 – результат

//Выделить биты 0,5,6,11

b = а & 0x0861;

//Выделить биты с 4 по 7(биты второй цифры справа)

b = а & 0x00F0;

Выделение битов по маске может сопровождаться проверкой их значений.

//Установлен ли 8-й бит

//(младший бит второго по счету байта)

if((а & 0x100)!=0)

Поразрядная операция ИЛИ

По отношению ко второму операнду (маске) логическая операция ИЛИ сохраняет те биты первого операнда, которые соответствуют нулевым битам маски, и безусловно устанавливает о 1 те биты результата, которые соответствуют единичным битам маски. Операция называется - установка битов но маске.

хххххххх – операнд

00111000 - маска

хх111ххх – результат

// Установить в 1 биты 0,5,6,11

а|=0x0861;

//Установить в 1 биты с 4 по 7

//(биты второй цифры справа)

а|=0x00F0;

Операция ИЛИ используется также для объединения значений непересекающихся битовых полей (логическое сложение), которые предварительно выделяются с помощью операции И.

int а=0х5555,b=0x4444,с;

с=а&0xFFF0|b&0xF; //с=aaab

В переменной c объединяются битовыеполя, выделенныеиз а, - три старшие шестнадцатеричные цифры (12 разрядов), и выделенные из b, - младшая шестнадцатеричная цифра (4 разряда).

с<<=1; с|=b&; b>>=1;

Содержимое слова с сдвигается влево, в результате чего «освобождается место» в самом правом его разряде. Затем операция И выделяет младший разряд из машинного слова b, который затем переносится в освободившийся разряд b с помощью операции ИЛИ.

 

Операция поразрядной инверсии

Поразрядная инверсия меняет значение каждого бит машинного слова на противоположное (инвертирует). Операция И в сочетании с инвертированной маской-константой производит очистку битов по маске.

// Очистить биты 0,5,6,11, остальные сохранить

а &= ~0x0861;

// Очистить биты с 4 по 7, остальные сохранить

//(биты второй цифры справа)

а &= ~0х00F0;

 

Поразрядная операция исключающее ИЛИ

Поразрядная операция исключающее ИЛИ выполняет над парами битов в операндах логическую операцию исключающее ИЛИ, называемую также неравнозначность, или сложение по модулю 2, - результат равен 1 при несовпадении значений битов. По отношению ко второму операнду (маске) логическая операция исключающее ИЛИ сохраняет те биты первого операнда, которые соответствуют нулевым битам маски, и инвертирует те биты результата, которые соответствуют единичным битам маски. Операция называется - инвертирование битов по маске.

// Инвертировать биты 0,5,6,11

а ^= 0x0861;

// Инвертировать биты с 4 по 7

//(биты второй цифры справа)

а ^= 0х00F0;

 

Операция сдвиг влево

Поразрядная операция сдвиг влево переносит каждый бит первого операнда на то количество разрядов влево, которое задано вторым операндом, освобождающиеся разряды справа заполняются нулями. Результат операции содержит сдвинутое машинное слово, а сами операнды не изменяются.

Естественно, что от программиста не требуется вручную интерпретировать перемещение разрядов машинного слова. Каждое перемещение имеет свою содержательную интерпретацию.

// Сдвиг влево на одну шестнадцатеричную цифру

а <<= 4;

// Установить 1 в n-й разряд машинного слова

а = 1<<n;

Операции сдвига часто используются для «подгонки» групп двоичных разрядов к требуемому их местоположению в машинном слове. После чего используются операции И, ИЛИ для выделения и изменения значений полей.

// Поменять местами две младшие цифры

int a=0x12345678;

int b=a&~0xFF| (a >>4) & 0xF | (a <<4) & 0xF0;

Первая операция И очищает две младшие шестнадцатеричные цифры (8 разрядов), вторая операция перемещает первую цифру на место нулевой (и выделяет), третья операция перемещает нулевую цифру на место первой, после чего все поля объединяются по ИЛИ.

У операции сдвига влево есть еще одна интерпретация, Если рассматривать машинное слово как целое без знака, то однократный сдвиг увеличивает его значение в два раза, двукратный - в четыре раза, n-кратный - в 2n раз. В таком виде, например, умножение числа на 10 можно представить так а*10=а*(8+2)=8*а +2*а:

(а<<3) + (а<<1)


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: