|
Программирование >> Структурное программирование
Замечание по мобильности 16.3 Поразрядные манипуляции с данными являются машинно-зависимыми. Отметим, что обсуждение поразрядных операций в этом разделе сопровождается показом двоичного представления целых операндов. Для детального изучения двоичной системы счислений (с основанием 2) смотрите приложение Г Системы счисления . Отметим также, что программы разделов 16.7 и 16.8 были проверены на РС-совместимых компьютерах с использованием Borland С++. Эта система использует 16-ти битовые (двухбайтовые) целые. Из-за машинно-зависимой природы поразрядных операций эти программы могут не работать в вашей системе. Существуют следующие поразрядные операции: поразрядное И (&), поразрядное ИЛИ (\), поразрядное исключающее ИЛИ сдвиг влево ( ), сдвиг вправо ( ); поразрядное НЕ (дополнение, отрицание) (~). (Обратите внимание, что мы уже использовали операции &, и для других целей. Это классический пример перегрузки операций). Операции поразрядное И, поразрядное ИЛИ и поразрядное исключающее ИЛИ выполняют поразрядное сравнение двух своих операндов. В результате проведения операции поразрядное И бит устанавливается в 1, если соответствующий бит в обоих операндах равен 1. В результате операции поразрядное ИЛИ бит устанавливается в 1, если хотя бы в одном из операндов он равен 1. В результате выполнения операции поразрядное исключающее ИЛИ бит устанавливается в 1, если соответствующий бит равен 1 в одном и только в одном операнде. Операция сдвига влево сдвигает биты своего левого операнда влево на количество битов, заданное правым операндом. Операция сдвига вправо сдвигает биты левого операнда вправо на количество битов, заданное правым операндом. Операция поразрядное НЕ устанавливает в своем операнде все биты со значениями О в 1, а все биты со значениями 1 в 0. Детальное обсуждение каждой поразрядной операции будет проведено ниже на конкретных примерах. Краткое описание поразрядных операций приводится на рис. 16.4.
Рис. 16.4. Поразрядные операции cout << endl; Введите целое без знака: 65000 65000 = 11111101 11101000 Рис. 16.5. Печать двоичного представления целого без знака (чааь 2 из 2) Оператор cout (value & displayMask ? 1 : О); определяет, надо ли печатать 1 или О для текущего самого левого бита переменной value. Предположим, что переменная value содержит 65000 (11111101 11101000). Если переменные value и displayMask соединяются ИИ При использовании поразрядных операций для большей наглядности полезно печатать двоичное представление значений. Программа, приведенная на рис. 16.5, печатает целое значение типа unsigned в двоичном представлении группами по восемь битов каждое. Функция displayBits применяет операцию поразрядное И к переменным value и displayMask. Часто операция поразрядное И используется с операндом, называемый маской - целым значением, в котором определенные биты установлены в 1. Маски используются для того, чтобы выделить в анализируемом значении указанные биты и сделать невидимыми остальные. В функции displayBits маске displayMask присвоено 1 15 (10000000 00000000). Операция сдвига влево смещает значение 1 влево и заполняет правые освободившиеся биты нулями. Печать двоичного представления целого без знака iinclude <iostream.h> #include <iomanip.h> main() { unsigned x; void displayBits (unsigned); cout << Введите целое без знака: ; cin >> х; displayBits(х); return 0; void displayBits(unsigned value) { unsigned c, displayMask = 1 15; cout << setw(7) value = ; for (c = 1; с <= 16; С++) { cout (value & displayMask ? 1: 0); value <<= 1; if (c % 8 == 0) cout ; операцией поразрядное И (&), то все биты за исключением бита самого старшего разряда переменной value маскируются (скрыты), поскольку результат операции И, примененной к любому биту и биту, содержащему О, дает 0. Если бит в самом старшем разряде value установлен в 1, то результат операции value & displayMask равен 1 и печатается 1; в противном случае определяется и печатается 0. Затем переменная value сдвигается влево на один бит с помощью выражения value = 1 (это равносильно выражению value = value 1). Эти шаги повторяются для каждого бита в переменной value типа unsigned. На рис. 16.6 приведены результаты действия операции поразрядное И на два бита.
Рис. 16.6. Результат объединения двух битов операцией поразрядное И Типичная ошибка программирования 16.6 Использование операции логическое И ( 8i8i) вместо операции поразрядное И ( 8i) и наоборот. Программа на рис. 16.7 показывает использование операций поразрядное И, поразрядное ИЛИ, поразрядное исключающее ИЛИ и поразрядное НЕ. Программа использует функцию displayBits для печати целого значения типа unsigned. Вывод программы показан на рис. 16.8. Использование операций поразрядное И, поразрядное ИЛИ, поразрядное исключающее ИЛИ и поразрядное НЕ. iclude <iostream.h> iclude <iomanip.h> lid displayBits(unsigned); mam () { unsigned numberl, number2, mask, setBits; numberl = 65535; mask = 1; cout << Результат объединения значений << endl; displayBits(numberl); displayBits(mask); cout << операцией поразрядное И & равен endl; displayBits(numberl & mask); Рис. 16.7. Использование операций поразрядное И, поразрядное ИЛИ, поразрядное исключающее ИЛИ и поразрядное НЕ (часть 1 из 2)
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |