Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
A.doc
Скачиваний:
36
Добавлен:
09.04.2015
Размер:
5.6 Mб
Скачать

82 Глава 2

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

Битовое исключающее ИЛИ (А), так называется потому, что работает подобно обычному ИЛИ, но когда оба бита операндов установлены в 1, возвращает 0. Таким образом, таблица истинности для него выглядит так, как показано в табл. 2.7.

Таблица 2.7. Таблица истинности для операции битового исключающего ИЛИ

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

Эта операция может быть представлена следующим образом:

Объединение их исключающим ИЛИ даст:

Переменная result получает значение 0x1В, или 27 в десятичной нотации.

Операция л имеет одно довольно неожиданное свойство. Предположим, что у вас есть две переменных типа char — first со значением 'А' и last со значением 'Z', что в двоичном виде представляется как 0100 0001 и0101 1010. Если вы запишете такие операторы:

то в результате first и last обменяются значениями без использования какой-либо памяти для промежуточного результата. Это работает с любыми целыми числами.

Битовое НЕ

Битовое НЕ (-) принимает единственный операнд, в котором инвертирует все биты: 1 становится 0, а 0 становится 1. Таким образом, если выполнить оператор

то если letter 1 равно 0100 0001, переменная result получит значение 1011 1110, то есть ОхВЕ, или 190 в десятичной нотации.

Битовые операции сдвига

Эти операции сдвигают значение целочисленных переменных на указанное коли- чество битов вправо или влево. Операция » предназначена для сдвига вправо, а опе- рация « — для сдвига влево. Биты, которые при этом "выпадают" за край значения, теряются. На рис. 2.11 показан эффект от сдвига значения 2-байтной переменной влево и вправо.

Вы объявляете и инициализируете переменную по имени number с помощью сле- дующего оператора:

unsigned int number = 16387U;

Данные, переменные и вычисления 83

Рис. 2.11. Сдвиг 2-байтной переменной влево и вправо

Как было показано ранее в этой главе, беззнаковые целочисленные литералы пи- шутся с добавлением к числу буквы U или и. Вы можете сдвинуть содержимое этой переменной влево следующим образом:

Левый операнд операции сдвига — это значение, которое нужно сдвинуть, а количество бит, на которое необходимо сдвинуть, задается правым операндом. Иллюстрация на рис. 2.11 демонстрирует эффект от операции сдвига. Как видите, сдвиг значения 16 387 на две позиции влево дает в результате 12. Такое значительное изменение значения объясняется потерей крайних бит, который уходят "за край" зна- чения.

Вы также можете сдвинуть значение вправо. Вернем переменной number началь- ное значение 16 387. Затем вы можете написать так:

Это сдвигает значение 16 387 на две позиции вправо, что дает в результате значе- ние 4096. Сдвиг вправо на две позиции равнозначен делению на 4 (без остатка). Это также показано на рис. 2.11.

До тех пор, пока крайние биты не теряются, сдвиг на п бит влево эквивалентен умножению значения на 2 п раз.

Другими словами, это эквивалентно умножению на 2". Но будьте осторожны: как вы видели на примере сдвига влево переменной number, если значащие биты теряют- ся, то результат будет совсем не таким, какой вы ожидаете. Однако это не отличается от операции умножения. Если вы умножите 2-байтное число на 4, то получите тот же результат, поэтому сдвиг влево и умножение все-таки эквивалентны. Проблема точно- сти возникает, когда результат умножения выходит за пределы допустимых значений 2-байтного целого.

Вы можете подумать, что между операциями сдвига и операциями, используемы- ми для ввода и вывода, возникает конфликт. До тех пор, пока это рассматривает ком- пилятор, значение операции в каждом конкретном случае всегда ясно из контекста.