Побитовые логические операции, операции над битами


В языке Си предусмотрен набор операций для работы с отдельными битами. Эти операции нельзя применять к переменным вещественного типа.

Обозначения операций над битами:

~ – дополнение (унарная операция); инвертирование (одноместная операция);

& – побитовое «И» – конъюнкция;

| – побитовое включающее «ИЛИ» – дизъюнкция;

^ – побитовое исключающее «ИЛИ» – сложение по модулю 2;

>> – сдвиг вправо;

<< – сдвиг влево.

Общий вид операции инвертирования (поразрядное отрицание):

~ выражение

инвертирует каждый разряд в двоичном представлении своего операнда.

Остальные операции над битами имеют вид:

Выражение_1 знак операции Выражение_2

Операндами операций над битами могут быть только выражения, приводимые к целому типу. Операции (~, &, |, ^) выполняются поразрядно над всеми битами операндов (знаковый разряд особо не выделяется):

~0xF0 « x0F

0xFF & 0x0F « x0F

0xF0 | 0x11 « xF1

0xF4 ^ 0xF5 « x01

Операция & часто используется для маскирования некоторого множества бит. Например, оператор w = n & 0177 передает в w семь младших бит n, полагая остальные равными нулю.

Операции сдвига выполняются также для всех разрядов с потерей выходящих за границы бит.

Операция (|) используется для включения бит w = x | y, устанавливает в единицу те биты в x, которые равны 1 в y.

Необходимо отличать побитовые операции & и | от логических операций && и || , если x = 1, y = 2, то x & y равно нулю, а x && y равно 1.

0x81 << 1 « 0x02

0x81 >> 1 « 0x40

Если выражение_1 имеет тип unsigned, то при сдвиге вправо освобо­жда­ющиеся разряды гарантированно заполняются нулями (логический сдвиг). Выражения типа signed могут, но необязательно, сдвигаться вправо с копированием знакового разряда (арифметический сдвиг). При сдвиге влево освобождающиеся разряды всегда заполняются нулями. Если выражение_2 отрицательно либо больше длины выражения_1 в битах, то результат операции сдвига не определен.

Унарная операция (~) дает дополнение к целому, т.е. каждый бит со значением 1 получает значение 0 и наоборот.

Операции сдвига << и >> применяются к целочисленным операндам и осуществляют соответственно сдвиг вправо (влево) своего левого операнда на число позиций, задаваемых правым операндом, например, x << 2 сдвигает x влево на две позиции, заполняя освобождающиеся биты нулями (эквивалентно умножению на 4).

Операции сдвига вправо на k разрядов весьма эффективны для деления, а сдвиг влево – для умножения целых чисел на 2 в степени k:

x << 1 « x*2; x >> 1 « x/2 ;

x << 3 « x*8 .

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

Операции сдвига не учитывают переполнение и потерю значимости.

В математическом смысле операнды логических операций над битами можно рассматривать как отображение некоторых множеств с размерностью не более разрядности операнда на значения {0,1}.

Пусть единица означает обладание элемента множества некоторым свойством, тогда очевидна теоретико-множественная интерпретация рассма­три­ваемых операций:

~ – дополнение; |– объединение; & – пересечение.

Простейшее применение – проверка нечетности целого числа:

int i;

...

if ( i & 1) printf (" Значение i четно!");

Комбинирование операций над битами с арифметическими операциями часто позволяет упростить выражения.

 



Дата добавления: 2017-10-04; просмотров: 1092;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.008 сек.