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, оставляя другие биты неизмененными.