В языке предусмотрен ряд операций для работы с битами;эти операции нельзя применять к переменным типа FLOAT илиDOUBLE. & Побитовое AND \! Побитовое включающее OR ^ побитовое исключающее OR << сдвиг влево >> сдвиг вправо \^ дополнение (унарная операция) "\" иммитирует вертикальную черту. Побитовая операция AND часто используется для маскированиянекоторого множества битов; например, оператор C = N & 0177передает в 'с' семь младших битов N , полагая остальные рав-ными нулю. Операция 'э' побитового OR используется для вклю-чения битов: C = X э MASK устанавливает на единицу те биты в х , которые равны единицев MASK. Следует быть внимательным и отличать побитовые операции& и 'э' от логических связок && и \!\! , Которые подразуме-вают вычисление значения истинности слева направо. Например,если х=1, а Y=2, то значение х&Y равно нулю , в то время какзначение X&&Y равно единице./почему?/ Операции сдвига << и >> осуществляют соответственносдвиг влево и вправо своего левого операнда на число битовыхпозиций, задаваемых правым операндом. Таким образом , х<<2сдвигает х влево на две позиции, заполняя освобождающиесябиты нулями, что эквивалентно умножению на 4. Сдвиг вправовеличины без знака заполняет освобождающиеся биты на некото-рых машинах, таких как PDP-11, заполняются содержанием зна-кового бита /"арифметический сдвиг"/, а на других - нулем/"логический сдвиг"/. Унарная операция \^ дает дополнение к целому; это озна-чает , что каждый бит со значением 1 получает значение 0 инаоборот. Эта операция обычно оказывается полезной в выраже-ниях типа X & \^077 где последние шесть битов х маскируются нулем. Подчеркнем,что выражение X&\^077 не зависит от длины слова и поэтомупредпочтительнее, чем, например, X&0177700, где предполага-ется, что х занимает 16 битов. Такая переносимая форма нетребует никаких дополнительных затрат, поскольку \^077 явля-ется константным выражением и, следовательно, обрабатываетсяво время компиляции. Чтобы проиллюстрировать использование некоторых операцийс битами, рассмотрим функцию GETBITS(X,P,N), которая возвра-щает /сдвинутыми к правому краю/ начинающиеся с позиции рполе переменной х длиной N битов. мы предполагаем , чтокрайний правый бит имеет номер 0, и что N и р - разумно за-данные положительные числа. например, GETBITS(х,4,3) возвра-щает сдвинутыми к правому краю биты, занимающие позиции 4,3и 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, оставляя другие биты неизмененными.