русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

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

Упражнение 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).

Просмотров: 718


Вернуться в оглавление



Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.