Использование битовых операций


Упражнение 1. Включить отмеченный символом * бит, то есть в нём получить единицу. Значения остальных бит должны остаться без изменения.

Условно это обозначим так:

· · · * · · · ·

?

? ? ? ? ? ? ? ?

· · · 1 · · · ·

Здесь символом · отмечен бит со значением нуль или единица, значение которого не должно меняться, символом * указан изменяемый бит. Символы ? означают, какую операцию (& или | или ^), с каким числом (00010000 или 11101111) надо выполнить для решения задачи. Проанализировав все шесть вариантов или некоторые из них, получаем

· · · * · · · ·

|

0 0 0 10 0 0 0

· · · 1 · · · ·

Операция битовое или с нулём не меняет значения бита (0 | 0 = 0; 1 | 0 = 1). В результате операции или с единицей всегда получится единица независимо от того, что было на месте символа “звёздочка”. А что запишем в программе? Так как работаем с одним байтом, то объявление будет таким: char c=5 (произвольное значение с 0 значением отмеченного “звёздочкой” бита). Операцию записываем следующим образом: с=с | 16 или с | =16, или с | = 0x10, где 0x10 — шестнадцатеричная константа 1016=1*16=1610. Получаем 000101012=1516=21 и, если выполнить

printf ("%5d" ,c);

выведем число 21.

Упражнение 2. Выключить отмеченный символом * бит, то есть в этом разряде получить 0. Значения остальных бит должны остаться без изменения.

Проанализировав, как и в упражнении 1, шесть вариантов или некоторые из них, получаем

· · · * · · · ·

&

1 1 1 0 1 1 1 1

· · · 0 · · · ·

Операция битовое и с единицей не меняет значения бита (0&1=0; 1&1=1), а с нулём всегда даст нуль независимо от того, что было на месте символа “звёздочка”. В программе пусть char c=0x32 (произвольное значение с 0 значением отмеченного “звёздочкой” бита). Выполним

с & = – 17; printf (“ %5d”, c);

Здесь 1 1 1 0 1 1 1 1 — это представление отрицательного числа –17.

0 0 1 1 0 0 1 0

&

1 1 1 0 1 1 1 1


0 0 1 0 0 0 1 0

Получим 2216=2*16+2=3410. Будет выведено число 34.

Упражнение 3. Заменить указанный бит (например, 5–й справа) на противоположный, не меняя значения остальных бит.

Ответ: с=с ^ 0x10. Самостоятельно объяснить результат.

Упражнение 4.Проверить, что находится в 4–м справа бите, нуль или единица.

Ответ: if (c & 8 = = 8) cout<< “единица”; else cout<<”нуль”;

Упражнение 5. Используя битовые операции, вывести двоичное представление двухбайтного целого числа.

Для получения двоичного представления выполняем следующее:

1–й ш а г. Выделяем (получаем) значение последнего (правого) бита:

с=number & 1.

2–й ш а г. Для получения значения предпоследнего бита сдвигаем число на один разряд вправо и используем ту же битовую операцию & c единицей.

3–й шаг. Если результат сдвига не запоминали, то сдвигаем число на два разряда вправо и применяем операцию & c единицей.

4–й шаг. Сдвигаем число на три разряда вправо и применяем ту же операцию.

16–й шаг. Сдвигаем число на пятнадцать разрядов вправо и применяем операцию & c единицей.

Предложенный алгоритм программируем так:

int main()

{ short number, c; // int по умолчанию

cin>>number;

int x=20; // текстовая координата x экрана

for (int j=0; j<16; j++) /* j<16, так как тип unsigned short определяет целое число с объёмом памяти 2 байта или 16 бит.*/

{ c=((number>>j) & 1); // Получаем нуль или один.

gotoxy(x--, wherey()); // Вывод справа налево

cout<<c;

}

getch(); return 0;

}

Замечания.

· В приведенном варианте значение переменной number не изменилось. Если бы результат сдвига запоминали, то на каждом шаге надо сдвигать всегда на один разряд:

number= number>> 1; или number >>= 1; а затем c=number & 1.

· Но в этом варианте значение number изменится.

· Можно усложнить программу таким образом, чтобы незначащие нули слева не выводились. Один из возможных вариантов решения следующий. Формируем массив a [16] из нулей и единиц в том же порядке, что и в приведенной программе, т. е. a[0] — значение последнего (правого) бита, a[1] — значение предпоследнего бита и так далее, a[15] — значение первого (левого) бита. Находим последний ненулевой элемент этого массива и, начиная с него, выводим массив в обратном порядке.

· С помощью приведенной программы можно выводить и двоичное представление отрицательных чисел. Поэтому этот вариант получения двоичного представления лучше алгоритма деления на два (см. функцию SUMDIG в § 2 гл. 1).



Дата добавления: 2016-07-18; просмотров: 1782;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.011 сек.