Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Рацеев С.М. Программирование на языке Си.pdf
Скачиваний:
366
Добавлен:
23.03.2016
Размер:
1.65 Mб
Скачать

int i, n;

n = 1 << size;

for(i = 1; i < n; i++) Print(a, size, i);

}

int main()

{

int a[5] = {1, 2, 3, 4, 5}; Subsets(a, 5);

return 0;

}

Пример 13. Заметим, что операцию ИСКЛЮЧАЮЩЕЕ ИЛИ

(^) можно рассматривать как сложение по модулю 2 в кольце вычетов Z2. Поэтому верно тождество x^x=0 для любого x из Z2. Поскольку операция ^ является побитовой, то тождество x^x=0 верно также для любой целочисленной переменной x. Исходя из данного факта, построим алгоритм, который меняет местами значения двух целочисленных переменных без использования буферной переменной.

int x = 1, y = 2;

x ^= y;

/* x = x^y */

y ^= x;

/* y = x^y = (x^y)^y =x */

x ^= y;

/* x = x^y = (x^y)^x =y */

/* теперь x=2, y=1 */

При этом все операции можно записать в одну строчку:

x ^= y ^= x ^= y;

12.3.Задачи

1.Найти количество нулевых и единичных битов в целом неотрицательном числе a.

206

2.Пусть имеется массив a размером n ≤ 32, состоящий из нулей и единиц. Требуется записать значения элементов массива a в переменную типа unsigned long в виде последовательности би-

тов a[n-1] … a[1]a[0].

3.Написать функцию проверки на четность целых чисел, используя только битовые операции.

4.Пусть дано целое число a. Вывести вначале значения его битов с четными индексами, а затем – с нечетными.

5.Пусть дано целое число a. Проверить, чередуются ли в нем единичные и нулевые биты.

6.В целом числе a сдвинуть все биты влево на k позиций, заменив освободившиеся биты единицами.

7.Осуществить циклический сдвиг битов в целом числе a на k позиций влево.

8.Осуществить циклический сдвиг битов в целом числе a на k позиций вправо.

9.Найти номер первого (последнего) справа единичного бита в целом числе a.

10.Найти номер первого (последнего) справа нулевого бита в целом числе a.

11.Определить, расположены ли биты в целом числе a в порядке возрастания, то есть представимо ли данное число в виде 2n – 1 для некоторого n.

12.Переставить биты в целом числе в обратном порядке.

13.Пусть имеется целое число a > 0. Записать в строковую переменную восьмеричное представление данного числа, используя следующее правило: двоичное представление числа a разбивается справа налево на триады (тройки цифр), и каждая триада заменяется восьмеричной цифрой.

14.Пусть имеется целое число a > 0. Записать в строковую переменную шестнадцатеричное представление данного числа, используя правило из предыдущей задачи, разбивая двоичное представление числа на тетрады (четверки цифр).

15.Написать функцию

unsigned long Perest(unsigned long x, unsigned char *pi, char n),

которая переставляет биты в числе x в соответствии с переста-

207

новкой pi из Sn (n = 32) и возвращает полученное значение в качестве результата.

208