Главная » Статьи » Програмування » C | [ Добавить статью ] |
Битовые операции.Только что мы с Вами разобрались с общей теорией, теперь пообщаемся с битовой арифметикой с точки зрения языка С. В языке C++ существует ряд операций, выполняющихся над разрядами. Они носят название битовые операции:
Остановимся на данных операциях более подробно. 1. Инверсия битов (поразрядное отрицание, дополнение до единицы) инвертирует биты, т.е. каждый бит со значением 1 получает значение 0 и наоборот. 2.Битовое "И" сравнивает последовательно разряд за разрядом два операнда. Для каждого разряда результат равен 1, тогда и только тогда, когда оба соответствующих разряда операндов равны 1. Так, например,
потому что только нулевой и четвертый разряды обоих операндов содержат 1. 3. Битовое "ИЛИ" сравнивает последовательно разряд за разрядом два своих операндов. Для каждого разряда результат равен 1 тогда и только тогда, когда любой из соответствующих разрядов операндов равны 1. Так, например,
потому что все разряды (кроме шестого) в одном из двух операндов имеют значение 1. 4. Битовое исключающее "ИЛИ" сравнивает последовательно разряд за разрядом два своих операндов. Для каждого разряда результат равен 1, если один из двух (но не оба) соответствующих разрядов операндов равен 1. Так, например,
Заметим, что, поскольку нулевой разряд в обоих операндах имеет значение 1, нулевой разряд результата имеет значение 0. Описанные выше операции часто используются для установки некоторых битов, причем другие биты остаются неизменными. Они удобны для фильтрации или маскирования битов. 5. Сдвиг влево сдвигает разряды левого операнда влево на число позиций, указанное правым операндом. Освобождающиеся позиции заполняются нулями, а разряды, сдвигаемые за левый предел левого операнда, теряются. Поэтому, например,
Таким образом, х<<2 сдвигает х влево на 2 позиции, заполняя освобождающиеся позиции нулями (эквивалентно умножению на 4). Для значений без знака имеем
Эти две операции выполняют сдвиг, а также эффективное умножение и деление на степени числа 2. Пример.
Примечание: Здесь мы с Вами знакомимся с еще
одной системой исчисления. Целые константы, начинающиеся с цифры 0, являются
восьмеричными числами. Восьмеричное представление целых чисел
особенно удобно, когда приходится работать с поразрядными операциями, так как
восьмеричные числа легко переводятся в двоичные. В этой задаче числа 01,02,03
соответствуют числам 1, 2 и 3, так что появление восьмеричных чисел служит
намеком, что программа рассматривает значения x, y и z как последовательности
двоичных цифр.
Комментарии к коду.
Примечание: В некоторых случаях вместо -1 может
получиться другой результат (8191). Появление этого значения объясняется тем,
что на некоторых компьютерах при операции сдвига знак числа может не
сохраниться. Не все трансляторы языка C гарантируют, что операция сдвига
арифметически корректна, поэтому в любом случае более ясным способом деления на
8 было бы явное деление y=y/8. Объединения.Структура данных объединение подобна структуре, однако в каждый момент времени может использоваться (является активным) только один из его компонентов. Шаблон объединения может задаваться записью вида:
Поля структуры размещаются в оперативной памяти одно за другим в той последовательности, в которой перечислены в описании. Поля объединений размещаются, начиная с одного места в памяти и, следовательно, накладываются друг на друга. Доступ к компонентам объединения осуществляется тем же способом, что и к компонентам структур. Пример.
В качестве более осмысленного примера объекта типа union рассмотрим объединение geom_fig[1]:
В этом примере обрабатывается только активный компонент, то есть компонент, который последним получает свое значение. Например, после присваивания значения компоненту radius не имеет смысла обращение к массиву b. Примечание: Обратите внимание на то, что на
одних компьютерах поля битов размещаются слева направо, на других - справа
налево. Это значит, что при всей полезности работы с ними, если формат данных, с
которыми мы имеем дело, дан нам свыше, то необходимо самым тщательным образом
исследовать порядок расположения полей; программы, зависящие от такого рода
вещей, не переносимы.
ВыводыОбъединения применяются для:
Таким образом, после задания рассмотренной структуры данных в программе будет находиться переменная, которая на законных основаниях может хранить "в себе" значения нескольких типов. | |||||||||||||||||||||||||||||||||||||||
Просмотров: 972 | Комментарии: 1 | |
Всего комментариев: 0 | |