Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Аленский. лекции по проге.doc
Скачиваний:
19
Добавлен:
11.11.2018
Размер:
1.35 Mб
Скачать

Задачи и упражнения.

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 была единица.

        1. 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 число, красным цветом выводится сообщение об ошибке и приглашение повторить ввод.

  1. Пусть 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–го справа бита на противоположное значение, т. е. нуль на единицу, а единицу на нуль? Нумерация битов с нуля.

  1. С помощью битовых операций вывести на экран:

а) значение k–го справа бита;

б) i–ю справа шестнадцатеричную цифру.

  1. Решить задачу упаковки (см. задачу 3) и распаковки, если диапазон чисел следующий: a) 0..1; б) 0..3; в) 0..7. Рассмотреть несколько вариантов объявления массива (unsigned short, char и др.).

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

Указание. Последнюю шестнадцатеричную цифру получаем с помощью операции number & 0xF, или number & 15. Кроме того, на каждом шаге число сдвигаем на четыре разряда. Выделенную шестнадцатеричную цифру с помощью if и switch анализируем и выводим либо цифры от 0 до 9, либо буквы A, B, C, D, E, F.

  1. В массиве целых положительных чисел найти все числа с наибольшим количеством единиц в двоичном представлении. Составить и использовать функцию, которая с помощью битовых операций находит количество единиц в двоичном представлении одного числа.