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



Побитовые логические операции - часть 2


getbits(x,p,n) /* get n bits from position p */ unsigned x, p, n; { return((x >> (p+1-n)) & \^(\^0 << n)); }

Операция x >> (p+1-n) сдвигает желаемое поле в правый конец слова. описание аргумента x как unsigned гарантирует, что при сдвиге вправо освобождающиеся биты будут заполняться нулями, а не содержимым знакового бита, независимо от того, на какой машине пропускается программа. Все биты константного выражения \^0 равны 1; сдвиг его на n позиций влево с помощью операции \^0<<n создает маску с нулями в n крайних правых битах и единицами в остальных; дополнение \^ создает маску с единицами в n крайних правых битах.

Упражнение 2-5

Переделайте getbits таким образом, чтобы биты отсчитывались слева направо.

Упражнение 2-6

Напишите программу для функции wordlength(), вычисляющей длину слова используемой машины, т.е. Число битов в переменной типа int. функция должна быть переносимой, т.е. Одна и та же исходная программа должна правильно работать на любой машине.

Упражнение 2-7

Напишите программу для функции rightrot(n,b), сдвигающей циклически целое n вправо на b битовых позиций.

Упражнение 2-8

Напишите программу для функции invert(x,p,n), которая инвертирует (т.е. заменяет 1 на 0 и наоборот) n битов x, начинающихся с позиции p, оставляя другие биты неизмененными.




Содержание  Назад  Вперед