4.4 Битовые операции.
Нам уже известно, что
наименьшая единица памяти компьютера называется
бит, и может принимать только два значения: 0 или 1.
Байт – более удобный элемент памяти. В
большинстве компьютеров байт состоит из 8 битов.
Значения переменной любого типа размещаются в
одном или нескольких байтах. С помощью этих
программ на Паскале и Си, Вы сможете увидеть, из
чего состоят любые данные – биты. Так выглядит
программа на Паскале:

А вот тоже на языке Си:

Рассмотрим некоторые
особенности наших программ более подробно.
В программе на Паскале,
директивы компилятора {$I-}, {$R-}отключают проверки ввода/вывода и
диапазона вводимого числа. Без директивы {$R-} попытка ввести число, больше 32767,
привела бы к аварийному завершению программы.
Если функция IOResult возвратит отличное от 0 число, то
процедура Halt прекратит
работу программы. Без этой процедуры цикл repeat-until был бы бесконечным.
Оператор SizeOf проверяет размер памяти в байтах
занимаемой переменной number.
Следовательно, количество битов, занимаемое
переменной number, будет в 8
раз больше.
В языке Си также предусмотрены
операции, помогающие манипулировать отдельными
битами данных целочисленных типов:
Оператор sizeof, в программе на Си, тоже определяет
размер памяти в байтах занимаемой переменной number. И количество битов, занимаемых
переменной number, также
будет в 8 раз больше. В переменной n запоминается количество битов,
отведённое под переменную number.
В программе на Си, оператор
цикла реализует интерактивный режим работы.
Здесь мы воспользовались тем, что функция scanf возвращает в качестве своего
значения число введённых полей, соответствующих
спецификации. В случае несоответствия
спецификации и вводимого символа функция
возвращает 0, а это соответствует лжи в условном
выражении. Ввод буквы вместо цифры по
спецификации %u заставит
функцию scanf выработать
значение 0 и тем самым завершить цикл.
Основной рабочий цикл for, программы на Си, в котором
осуществляется анализ, использует операцию
“запятая” для инициализации рабочей переменной
m. Сначала ей
присваивается значение равное 1, а затем
выполняется операция <<.
Операция << называется операцией сдвига, она
сдвигает свой левый операнд влево на число
битовых позиций, задаваемое правым операндом,
заполняя освобождающиеся биты 0. Таким образом,
значение переменной m в
битовом (двоичном) представлении равно 10000000
00000000 или единице в крайнем
левом разряде.
В программе же на Паскале, сдвиг
элемента m, имеющего
начальное значение 1, на i
позиций влево, осуществляется операцией shl. Так как значение выражения (m
shl i) имеет только один
установленный бит (с номером i), то значение выражения (m shl i) and
number отлично от 0, только если в
переменной number этот бит
также установлен. При этом значение в точности
равно (m shl i). Деление (m
shl i) and number на (m shl i) даст 0, если i-й
бит в number не установлен, или 1,
если он установлен.
Очередная битовая операция,
программы на Си, & в
логическом выражении (number & m) даёт результат 1, если оба операнда
равны 1. Если хоть один из операндов равен 0, то и
результат всей операции тоже 0. В одном из битов
текстовой переменной m, 1
мы создаём сами и, таким образом, результат
условного выражения будет зависеть от значения
соответствующего бита в переменной number. В соответствии с результатом
условно выражения на экран будет выведено либо 0,
либо 1.
Следующая битовая операция на
Си: >> сдвигает свой левый
операнд на число битовых позиций, задаваемое
правым операндом, и заполняет освободившиеся
биты нулями. После выполнения этой операции
сдвига значение выражения m станет равным 01000000 00000000. При прохождении очередного шага
цикла for значение переменной
изменится так, что 1 в её двоичном представлении
перемещается из крайнего левого положения в
крайнее правое, что позволяет проверить все
разряды очередного вводимого числа.
Кроме рассмотренных операций,
имеются ещё и другие битовые операции.
Рассмотрим их:

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