Поразрядные логические операции
Задачи
1. Переведите в 8-разрядный двоичный код десятичные числа 31 и 19 и сложите их. Для проверки переведите полученную сумму в десятичную систему счисления.
2. Повторите вычисления предыдущей задачи, заменив первое слагаемое на -31. Подумайте, что изменится, если код сделать 16-разрядным?
3. Выберите произвольные значения двух целых чисел А и В и запишите их в виде 8-разрядных двоичных кодов. Проверьте путем непосредственных вычислений справедливость тождества А — В = А + (-В).
4. Сложение ведётся в 8-разрядной арифметике со знаком. Какое максимальное число можно прибавить к двоичной константе 1000002, чтобы не возникло переполнения? Как изменится результат, если число будет беззнаковым?
5. Переведите в двоичный код десятичные числа 12 и 7 и перемножьте их. Для проверки переведите результат в десятичную систему счисления.
6. Повторите вычисления предыдущей задачи, заменив первый сомножитель на -12. Считайте, что числа представлены в 8-разрядном коде.
7. Братья Петя и Коля часто спорят по поводу решения задач по информатике. Главная причина состоит в том, что Петя всегда решает задачу, как показал учитель, а Коля вечно придумывает что-то своё, причём не всегда удачно. Сегодня, например, они осваивали двоичную арифметику, умножая 10002 на 110112. Петя добросовестно умножал столбиком, а Коля взял второй сомножитель и, приписав к нему три нуля, получил такой же ответ. После объяснений Петя был вынужден признать правоту брата. Как объяснил свое решение Коля?
8. Какое из двух беззнаковых чисел больше: 0111 0111 или 1000 1000? Изменится ли ваш ответ, если вам скажут, что исходные коды — это 8-разрядные числа со знаком? Переведите оба значения для случаев чисел со знаком и без него в десятичную систему счисления.
9. Код строчной латинской буквы 'а' равен 6116, а заглавной 'А' — 4116. Используя логическую операцию «И», преобразуйте код строчной буквы в код заглавной. Проверьте, работает ли предложенный вами метод для других букв.
10. Используя логическую операцию «ИЛИ», преобразуйте код заглавной буквы 'А' в код строчной 'а'. Проверьте, работает ли предложенный вами метод для других букв.
11. Петя и Коля решают домашнюю задачу: известны коды двух введённых цифр C1 и С2. Найти сумму этих цифр. Петя, как обычно, глядя на цешение задач в классе, пишет:
1) N1 = C1 and 0F16;
2) N2 = С2 and 0F16;
3) S = N1 + N2.
Коля предлагает более короткое решение:
1) S = С1 + С2;
2) S = S and 0F16.
Петя, ссылаясь на образцы задач в учебнике, критикует такой подход. Но Коля показывает на двух примерах ('2' и '3'; '5' и '7'), что его алгоритм даёт правильные результаты. Что скажет учитель по поводу Колиного решения?
12. Выполните битовую операцию X and 3 для следующих десятичных значений X: 4, 5, 8, 15, 16. Для каких из них получился нулевой ответ? Что общего у этих чисел?
13. Разработайте аналогичные способы определения делимости на 2, 8 и 16.
*14. Попробуйте разработать алгоритм, который позволяет поменять местами значения двух ячеек памяти, используя только операцию «исключающее ИЛИ».
15. Цвет точки в формате RGB хранится как 4-байтовое целое число, которое в шестнадцатеричном виде выглядит так: 00 RR GG ВВ (т. е. старший байт не используется, а в каждом из последующих байтов хранится одна из трёх цветовых компонент 1). Напишите последовательность операций, позволяющих выделить из 32-битного числа каждую из трёх цветовых компонент. Какая из них потребует большего числа операций?
1 Несмотря на то что старший байт кажется лишним, этот способ хранения не лишён смысла. Дело в том, что процессор не приспособлен к обработке 3-байтовых данных, тогда как с 4-байтовыми работает очень быстро. Описанный формат, в частности, применяется при хранении таблиц цветов в графическом формате ВМР. В других форматах (например, в PNG) старший байт используется для хранения степени прозрачности пикселя (альфа-канала).
16. Петя и Коля решают задачу: цвет точки в формате RGB хранится как 4-байтовое целое число N, которое в шестнадцатеричном виде выглядит так: 00 RR GG ВВ. Написать последовательность операций, позволяющих выделить из 32-битного числа красную компоненту. Петино решение:
1) N = N and FF000016;
2) логический сдвиг N вправо на 16 разрядов.
Колино решение содержит только вторую из этих операций. Чьё решение правильное?
17. Используя только сдвиги, сбросьте 4 старших разряда 8-битного значения. Как с помощью сдвигов сбросить 4 младших разряда?
18. Каков результат логического сдвига влево на 4 разряда шестнадцатеричного целого числа FEDC16? Сравните его с результатом циклического сдвига.
19. Заданы два шестнадцатеричных целых числа: 123416 и FEDC16. К каждому из них применяются логический, циклический и арифметический сдвиги вправо на 4 разряда (каждый раз сдвигается первоначальное значение, а не результат предыдущего сдвига!) Напишите и объясните результаты для каждой операции.
20. Запишите число —18 в 8-разрядном двоичном коде. Что получится, если применить к нему логический сдвиг вправо? Арифметический сдвиг вправо? Сравните полученные результаты и объясните их.
21. Переведите число -1 в дополнительный двоичный код и дважды примените к нему арифметический сдвиг вправо. Какой будет результат?
22. Выполните приведённый в тексте параграфа алгоритм умножения на 10 для Z = 11002. Для проверки переведите результат в десятичную систему счисления.
Следующая страница §29. Хранение в памяти вещественных чисел