Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OAiP_Konspekt_lektsy.pdf
Скачиваний:
33
Добавлен:
11.05.2015
Размер:
843.37 Кб
Скачать

<выражение 1> <операция> <выражение 2>

-если выражение 1 операции конъюнкция ложно, то результат опе- рации ноль и выражение 2 не вычисляется;

-если выражение 1 операции дизъюнкция истинно, то результат опе- рации единица и выражение 2 не вычисляется.

Пример правильной записи двойного неравенства:

0<x<100

(0<x) && (x<100)

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

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

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

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

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

| - побитовое включающее ИЛИ - дизъюнкция; ^ - побитовое исключающее ИЛИ - сложение по модулю 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 могут, но необязательно, сдвигаться впра-

24

PDF created with pdfFactory Pro trial version www.pdffactory.com

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

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

полезной в выражениях типа

X & (~)077,

где последние 6 бит X маскируются нулем.

Операции сдвига << и >> осуществляют соответственно сдвиг впра- во (влево) своего левого операнда на число позиций, задаваемых правым операндом, например, 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 четно!");

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

6.10. Операция «,» (запятая)

Данная операция используется при организации строго гарантиро- ванной последовательности вычисления выражений (используется там, где по синтаксису допустима только одна операция, а нам необходимо разместить две и более, например, в операторе for). Форма записи:

выражение 1, , выражение N;

выражения 1,…,N вычисляются последовательно и результатом операции становится значение выражения N, например:

m =(i =1, j =i ++, k =6, n =i+j+k);

получим последовательность вычислений: i =1, j =i =1, i =2, k=6, n=2+1+6, и в результате m=n=9.

25

PDF created with pdfFactory Pro trial version www.pdffactory.com

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]