1. Пусть int a=170. Определить результат:
а) r = a & 15;
б) r = a | 8;
в) if (a & 8 = = 8) cout<<” Yes”; else cout<<”No”;
Решение. Число 170 переводим в шестнадцатеричную систему счисления делением на 16. Получим 17010=AA16. Каждую шестнадцатеричную цифру запишем в виде двоичной тетрады и добавим необходимое количество незначащих нулей. Получим 00000000000000000000000010101010.
a) 1510 = 11112. Учитывая правила выполнения операции &, получим десятичное число 10 или шестнадцатеричное A, т. е. с помощью этой операции всегда выделяется последняя шестнадцатеричная цифра числа.
б) Так как 810=10002 и принимая во внимание правила выполнения операции | (битовое или), получим то же число 170.
в) Так как в двоичном представлении числа 8 есть всего одна единица, то результатом операции a & 8 будет либо 0, либо 8 =10002 в зависимости от того, что находится в 3–м справа бите числа a (нумерация битов с нуля). В нашем примере получим 8, и будет выведено “YES”, что означает, что в 3–м справа бите исходного числа a была единица.
i. 2. Определить результат:
unsigned short a; cin>>a;
a=a & 0xFFF7; cout<<a;
Решение. Введем, например, число 26. В двоичной системе счисления это 0000000000011010.
Так как FFF716=11111111111101112, то операция &(битовое и) оставит без изменения все биты, кроме третьего справа. Независимо от того, что было в этом бите (0 или 1), получится нуль, т. е. мы “выключили” третий справа бит. В результате получим 00000000000100102=18, т. е. будет выведено число 18. Если введем, например, число 23, то это число не изменится, так как в третьем бите был 0.
3. Упаковка информации. Пусть по условию задачи известно, что числа массива находятся в диапазоне от 0 до 15, т. е. каждое число занимает четыре бита. Надо обработать 20 таких чисел. Нет типа данных для хранения четырех битов. В каждом элементе массива типа unsigned short размером два байта (16 битов) можно разместить 16/4=4 числа из указанного диапазона. Поэтому для хранения 20 таких чисел понадобится массив из 20/4=5 элементов. 20 введенных чисел из диапазона 0..15 записать в массив типа unsigned short размерности 5.
unsigned short MyINP( unsigned short myMAX);
int main()
{ const int k=4, // размерность числа 0..15 4 бита
n=20, // количество чисел
size=n*k/(sizeof(unsigned short)*8); // размерность массива
unsigned short number, array[size];
for (int i=0;i<size;i++)
for(int j=1;j<=k;j++)
{ number=MyINP(15);
array[i]=(array[i]<<k) | number;
}
for (int i=0; i<size;i++)
// вывод в шестнадцатеричной системе счисления пяти
// шестнадцатеричных цифр
printf("%X ",array[i]);
getch(); return 0; }
unsigned short MyINP( unsigned short myMAX)
{ unsigned short x;
while (true) { cin>>x; if (x<=myMAX) return x;
textcolor(4); cprintf("ERROR Repeat");
} }
Функция MyINP вводит целое положительное число, меньшее или равное myMAX. При попытке ввести неположительное или большее myMAX число, красным цветом выводится сообщение об ошибке и приглашение повторить ввод.
4. Пусть int a=-8, b=23. Что получится в результате выполнения следующей части программы:
printf (“%d %X %d %X”, a & b, a | b, a ^ b, ~a).
5. Найти значение переменной r, объявленной как int r, если:
а) r= ~(100>>2) & ~(–10) | 0x10;
б) r=162 | 0x10A & 111;
в) r= –10 & 1|4;
г) r=(123<<4)& 123.
6. Найти значение этого же выражения из предыдущего упражнения, если переменная объявлена как unsigned short r.
7. Пусть в ячейке, объявленной short a, хранится следующая двоичная последовательность:
а) 0000001001001001; б) 1100000000001000;
в) 1111111111111000; г) 1000000000000000.
Что это за число в десятичной системе счисления? шестнадцатеричной системе счисления?
8. Выполнить предыдущее упражнение, если переменная объявлена как unsigned short a.
9. Как включить 4-й справа бит, т. е. поместить туда единицу независимо от того, какое там было значение, нуль или единица? Нумерация битов с нуля.
10. Как заменить значение 2–го справа бита на противоположное значение, т. е. нуль на единицу, а единицу на нуль? Нумерация битов с нуля.
11. С помощью битовых операций вывести на экран:
а) значение k–го справа бита;
б) i–ю справа шестнадцатеричную цифру.
12. Решить задачу упаковки (см. задачу 3) и распаковки, если диапазон чисел следующий: a) 0..1; б) 0..3; в) 0..7. Рассмотреть несколько вариантов объявления массива (unsigned short, char и др.).
13. Используя битовые операции, вывести шестнадцатеричное представление без знакового двухбайтного целого числа.
Указание. Последнюю шестнадцатеричную цифру получаем с помощью операции number & 0xF, или number & 15. Кроме того, на каждом шаге число сдвигаем на четыре разряда. Выделенную шестнадцатеричную цифру с помощью if и switch анализируем и выводим либо цифры от 0 до 9, либо буквы A, B, C, D, E, F.
14. В массиве целых положительных чисел найти все числа с наибольшим количеством единиц в двоичном представлении. Составить и использовать функцию, которая с помощью битовых операций находит количество единиц в двоичном представлении одного числа.