Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
программирование.doc
Скачиваний:
9
Добавлен:
02.02.2015
Размер:
188.42 Кб
Скачать

Операции сдвига

Применяются только к целочисленным операндам. Сдвигают биты в двоичном представлении операнда 1 на количество разрядов, указанных в операнде 2. При сдвиге влево освободившиеся разряды занимаются нулями. При сдвиге вправо в беззнаковых операндах освободившиеся биты занимаются нулями, а в знаковых – заполняются знаковым битом.

short int x = 9, y; //x = 00000000 00001001

y = x << 3; //y = 00000000 010010002 = 7210

y = x >> 2; //y = 00000000 000000102 = 210

Сдвиг влево на 3 – умножение на 23 = 8, вправо – целочисленное деление на 22 = 4.

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

01.10.2012

Операции сравнения (<, <=, >, >=, !=, ==)

Выполняют сравнение первого операнда со вторым. Операнды могут быть арифметических типов/указателями. Результатом является значение “true”/ “false”. Любое ненулевое значение – “true”, 0 = “false”.

cout << (3 == 2) // 0

cout << (3 == 3) // 1

Побитовые логические операции (&, |, ^)

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

Таблица истинности

x

y

& (и)

| (или)

^ (xor)

0

0

0

0

0

1

0

0

1

1

0

1

0

1

1

1

1

1

1

0

Типичный случай использования битовых операций – это определение/установка значений отдельных битов или групп битов.

unsigned x = 0;

y = x | (1 << 3);

0000 0000

| 0000 1000

0000 1000

unsigned x;

y = x | (1 << 3);

1001 0100

| 0000 1000

1001 1100

Операция | – битовое сложение. Операция & – битовое умножение.

1) unsigned x;

y = x & (1 << 3);

1001 0100

& 0000 1000

0000 0000

2) y = (x & (1 << 3)) >> 3 // y = 0 или y = 1

3) 0010 1010 << 4

1010 0000 >> 7

0000 0001

Логические операции (&&, ||)

Операнды могут быть либо арифметическими типами, либо указателями, причём в любых сочетаниях. Таблицы истинности такие же, как и для побитовых операций.

unsigned x = 3, y = 5, z = 0;

cout << (x && y); //1

cout << (x || y); //1

cout << (x && z); //0

cout << (x || z); //1

cout << !(x || y); //0

Логические операции вычисляются слева направо, т.е. сначала первый операнд, а потом второй. Если значения первого операнда достаточно, чтобы определить результат, то второй операнд не вычисляется.

unsigned x = 3, y = 5, z = 0;

z = (x && y ++); //z = 1;

out << z << “ ” << y; //1 6

z = (x || y ++); //z = 1;

out << z << “ ” << y; //1 5

Т.к. в примере с “||”: оп 1 ≠ 0 => ответ – “не ноль”.

Операция присваивания

Lvalue (от Left value) – значение, которое может находится в левой части оператора присваивания.

Формат операции: Lvalue op expression (не всегда является именем переменной)

В простейшем случае сначала вычисляется выражение в правой части, затем его результат записывается в место памяти, соответствующее Lvalue. В более сложных случаях при вычислении expression может использоваться значение Lvalue. Общий формат этих более сложных случаев следущий:

Lvalue op= expression  Lvalue = Lvalue op expression

int a = 5;

a = a + 10 a += 10 – предпочтительнее и эффективнее, т.к. адрес вычисляется только один раз

Как и все операции в С++, операция присваивания имеет результат. Результатом является значение Lvalue после выполнения операции. Это позволяет встраивать операцию присваивания внутрь других выражений.

1) int a = 5;

cout << ((a += 3) + 2); //17

2) a = b = c = 1;