- •6 Глава 1
- •12 Глава 1
- •14 Глава 1
- •16 Глава 1
- •18 Глава 1
- •20 Глава 1
- •22 Глава 1
- •24 Глава 1
- •26 Глава 1
- •31 Глава 1
- •34 Глава 2
- •36 Глава 2
- •Puc. 2.4. Дополнительные опции консольного приложения Win32
- •38 Глава 2
- •40 Глава 2
- •42 Глава 2
- •44 Глава 2
- •48 Глава 2
- •50 Глава 2
- •52 Глава 2
- •54 Глава 2
- •56 Глава 2
- •58 Глава 2
- •60 Глава 2
- •62 Глава 2
- •64 Глава 2
- •66 Глава 2
- •68 Глава 2
- •70 Глава 2
- •74 Глава 2
- •76 Глава 2
- •79 Глава 2
- •82 Глава 2
- •84 Глава 2
- •86 Глава 2
- •88 Глава 2
- •92 Глава 2
- •94 Глава 2
- •96 Глава 2
- •98 Глава 2
- •103 Глава 2
- •105 Глава 2
- •107 Глава 2
- •110 Глава 2
- •115 Глава 3
- •119 Глава 3
- •121 Глава 3
- •123 Глава 3
- •125 Глава 3
- •129 Глава 3
- •131 Глава 3
- •133 Глава 3
- •139 Глава 3
- •141 Глава 3
- •143 Глава 3
- •145 Глава 3
- •148 Глава 3
- •150 Глава 3
- •155 Глава 3
- •165 Глава 4
- •168 Глава 4
- •170 Глава 4
- •173 Глава 4
- •175 Глава 4
- •178 Глава 4
- •184 Глава 4
- •186 Глава 4
- •188 Глава 4
- •190 Глава 4
- •192 Глава 4
- •194 Глава 4
- •198 Глава 4
- •201 Глава 5
- •203 Глава 5
- •205 Глава 5
- •207 Глава 5
- •213 Глава 5
- •217 Глава 5
- •219 Глава 5
- •221 Глава 5
- •223 Глава 5
- •225 Глава 5
- •227 Глава 5
- •232 Глава 5
- •234 Глава 5
- •236 Глава 5
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;
Данные,
переменные
и
вычисления
Рис. 2.11. Сдвиг 2-байтной переменной влево и вправо
Как было показано ранее в этой главе, беззнаковые целочисленные литералы пи- шутся с добавлением к числу буквы U или и. Вы можете сдвинуть содержимое этой переменной влево следующим образом:
Левый операнд операции сдвига — это значение, которое нужно сдвинуть, а количество бит, на которое необходимо сдвинуть, задается правым операндом. Иллюстрация на рис. 2.11 демонстрирует эффект от операции сдвига. Как видите, сдвиг значения 16 387 на две позиции влево дает в результате 12. Такое значительное изменение значения объясняется потерей крайних бит, который уходят "за край" зна- чения.
Вы также можете сдвинуть значение вправо. Вернем переменной number началь- ное значение 16 387. Затем вы можете написать так:
Это сдвигает значение 16 387 на две позиции вправо, что дает в результате значе- ние 4096. Сдвиг вправо на две позиции равнозначен делению на 4 (без остатка). Это также показано на рис. 2.11.
До тех пор, пока крайние биты не теряются, сдвиг на п бит влево эквивалентен умножению значения на 2 п раз.
Другими словами, это эквивалентно умножению на 2". Но будьте осторожны: как вы видели на примере сдвига влево переменной number, если значащие биты теряют- ся, то результат будет совсем не таким, какой вы ожидаете. Однако это не отличается от операции умножения. Если вы умножите 2-байтное число на 4, то получите тот же результат, поэтому сдвиг влево и умножение все-таки эквивалентны. Проблема точно- сти возникает, когда результат умножения выходит за пределы допустимых значений 2-байтного целого.
Вы можете подумать, что между операциями сдвига и операциями, используемы- ми для ввода и вывода, возникает конфликт. До тех пор, пока это рассматривает ком- пилятор, значение операции в каждом конкретном случае всегда ясно из контекста.