Пятница, 29.03.2024, 00:07
Главная Регистрация RSS поиск
Приветствую Вас, Гость
Меню сайта
Категории раздела
HTML [44]
Visual C++ и MFC [21]
c++ [78]
php [19]
Javascript [15]
C# [51]
загрузки [0]
XNA [10]
создание игр с помощью xna
Наш опрос
Каким языком программирования вы увлекаетесь
Всего ответов: 2420
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Реклама
Главная » Статьи » c++

Битовые операции

Вступление

Как вам известно, у компьютера минимальной единицей измерения информации является бит, который представляет собой один двоичный разряд (то есть может принимать два значения 0 и 1). Но минимальной адресуемой единицей памяти компьютера является байт. Так зачем же нужны битовые операции?

Во-первых, разработчики Windows всегда старались сделать так, чтобы старшие поколения Windows поддерживали, по возможности, младшие версии. То есть приложения, работающие в 16-разрядной Windows, должны поддерживаться 32-разрядной Windows. А так как раньше экономия оперативной памяти было очень важным делом, то многие функции Windows возвращают значения, с которыми приходиться работать на уровне битов. Ярким примером может служить функция Windows - GetLogicalDrives(), которая возвращает имена найденных в системе логических дисков. Если в возращаемом значении соответствующий бит установлен в 1, то данный логический диск обнаружен (0-й бит - диск A, 1-й бит - диск B и т. д.); для вызова функии необходимо подключить библиотеку windows.h.

Во-вторых, к битовым операциям необходимо прибегать при работе с некоторыми системными функциями (особенно функциями для работы с оборудованием).

В-третьих, битовые операции часто приходиться использовать при работе с графикой (имеется в виду программирование с графикой). Как вы знаете, для работы с графикой на компьютере в большинстве случаев используется цветовая модель RGB. Битовые операции будут незаменимы, если вам, например, необходимо выделить какой-то один канал, или узнать процентное содержание красного, зеленого или синего цветов в исходном. Кстати, цвета удобно представлять в 16-чном виде - в этом случае количественная мера для каждого из цветовых каналов очевидна, в случае 10-чного числа этого сказать практически никогда нельзя.

Битовые операции

Битовых операций всего 6 (приводятся с учетом приоритета):

~ - побитовое отрицание

<< - побитовый сдвиг влево

>> - побитовый сдвиг вправо

& - побитовое умножение

^ - побитовое исключающее сложение (сложение по модулю)

| - побитовое сложение

Побитовое отрицание

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

Пример:

Если применить эту операцию к двоичному числу 01010110 (примеры на двоичных числах более наглядны), то ~010101102 = 101010012

В графике эта операция называется инверсией.

Побитовый сдвиг влево

<< - при побитовом сдвиге влево каждый бит числа сдвигается на заданное количество разрядов (N разрядов) влево. При этом в результирующем числе N старших разрядов теряется, а в N младших разрядах появляются нули. Если правый операнд содержит отрицательное значение или его значение >= количеству бит в левом операнде, то результат операции не определен. Результат имеет тип левого операнда. Данная операция чаще всего применяется для помещения битов в заданную позицию.

Примечание: Для побитового сдвига влево a << N = a * 2N, причем такой способ умножения работает во много раз быстрее операции арифметического умножения *.

Пример:

100111012 << 3 = 111010002

Побитовый сдвиг вправо

>> - при побитовом сдвиге вправо каждый бит числа сдвигается на заданное количество разрядов (N разрядов) вправо. При этом в результирующем числе N младших разрядов теряется, а в N старших разрядах появляются нули, если левый операнд содержит положительное значение, или в N старших разрядах появляются единицы (справедливо для Microsoft Visual C++, но не обязательно для других платформ), если левый операнд содержит отрицательное значение. Если правый операнд содержит отрицательное значение или его значение >= количеству бит в левом операнде, то результат операции не определен. Результат имеет тип левого операнда. Данная операция чаще всего применяется для помещения битов в заданную позицию.

Примечание: Для побитового сдвига вправо a >> N = a / 2N, при N >= 0 (для N < 0 работает не всегда). Такой способ деления работает во много раз быстрее операции арифметического деления / (хотя в случае операции сдвига деление всегда целочисленное).

Пример:

010111012 >> 3 = 000010112

100111012 >> 3 = 111100112

Побитовое умножение

& - при побитовом умножении каждый бит одного числа умножается на соответствующий ему бит (находящийся в той же позиции) другого числа. При этом в результирующем числе соответствующий бит будет равен единице только в том случае если биты обоих чисел в этой позиции были равны единицам, в противном случае соответствующий бит результирующего числа будет равен нулю.

Примечание: Для побитового умножения a & a = a

Пример:

Дано двоичное число 10011101, необходимо выделить его старшую часть. Для этого данное число необходимо побитово умножить на число, содержащее в старшей части единицы, а в младшей - нули (таким образом число 111100002 является маской).

100111012 & 111100002 = 100100002

Побитовое исключающее сложение

^ - при побитовом исключающем сложении (на жаргоне эта операция называется сложением по модулю или XOR) каждый бит одного числа складывается с соответствующим ему битом (находящимся в той же позиции) другого числа. При этом в результирующем числе соответствующий бит будет равен единице только в том случае если биты обоих чисел в этой позиции были различны (0 и 1 или 1 и 0), в противном случае (если биты имеют одинаковые значения: 0 и 0 или 1 и 1) соответствующий бит результирующего числа будет равен нулю.

Примечание: Для сложения по модулю a ^ a = 0

Пример:

Дано двоичное число 10000101, необходимо переключить его нечетные биты (1-й, 3-й, 5-й, 7-й). Для этого данное число необходимо сложить по модулю с числом, содержащим единицы в заданных разрядах.

100001012 ^ 101010102 = 001011112

Операция XOR также широко используется во многих алгоритмах шифрования информации, так как эта операция обладает свойством обратимости. Это означает, что если над результатом приведенного выше примера повторно провести ту же операцию, то результатом будет исходное число.

001011112 ^ 101010102 = 100001012

Число 101010102 в данном случае будет называться ключом шифрования.

Побитовое сложение

| - при побитовом сложении каждый бит одного числа складывается с соответствующим ему битом (находящимся в той же позиции) другого числа. При этом в результирующем числе соответствующий бит будет равен нулю только в том случае если биты обоих чисел в этой позиции были равны нулю, в противном случае соответствующий бит результирующего числа будет равен единице.

Примечание: Для побитового сложения a | a = a

Пример:

Дано двоичное число 10000101, необходимо выставить его нечетные биты (1-й, 3-й, 5-й, 7-й) в единицу. Для этого данное число необходимо побитово сложить с числом, содержащим единицы в заданных разрядах.

100001012 | 101010102 = 101011112

В следующем разделе будет рассмотрен пример использования битовых операций.  

Категория: c++ | Добавил: slava (30.05.2011)
Просмотров: 15345 | Рейтинг: 4.5/10
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]