2.9. Побитовые логические операции
В языке предусмотрен ряд операций для работы с битами;
эти операции нельзя применять к переменным типа 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, оставляя другие биты неизмененными.
2.10. Операции и выражения присваивания.
Такие выражения, как I = I + 2 в которых левая часть повторяется в правой части могут быть записаны в сжатой форме
I += 2 используя операцию присваивания вида +=.
Большинству бинарных операций (операций подобных +, которые имеют левый и правый операнд) соответствует операция присваивания вида оп=, где оп - одна из операций
+ - * / % << >> & ^ !
Если е1 и е2 - выражения, то
е1 оп= е2 эквивалентно е1 = (е1) оп (е2) за исключением того, что выражение е1 вычисляется только один раз. Обратите внимание на круглые скобки вокруг е2:
X *= Y + 1 то X = X * (Y + 1) не X = X * Y + 1 В качестве примера приведем функцию BITCOUNT, которая подсчитывает число равных 1 битов у целого аргумента.
BITCOUNT(N) /* COUNT 1 BITS IN N */ UNSIGNED N;
( INT B;
FOR (B = 0; N != 0; N >>= 1) IF (N & 01) B++;
RETURN(B);
)
Не говоря уже о краткости, такие операторы приваивания имеют то преимущество, что они лучше соответствуют образу человеческого мышления. Мы говорим: “прибавить 2 к I” или “увеличить I на 2”, но не “взять I, прибавить 2 и поместить результат опять в I”. Итак, I += 2. Кроме того, в громоздких выражениях, подобных
YYVAL[YYPV[P3+P4] + YYPV[P1+P2]] += 2 Tакая операция присваивания облегчает понимание программы, так как читатель не должен скрупулезно проверять, являются ли два длинных выражения действительно одинаковыми, или задумываться, почему они не совпадают. Такая операция присваивания может даже помочь компилятору получить более эффективную программу.
Мы уже использовали тот факт, что операция присваивания имеет некоторое значение и может входить в выражения; самый типичный пример
WHILE ((C = GETCHAR()) != EOF) присваивания, использующие другие операции присваивания (+=, -= и т.д.) также могут входить в выражения, хотя это случается реже.
Типом выражения присваивания является тип его левого операнда.
Упражнение 2-9.
В двоичной системе счисления операция X&(X-1) обнуляет самый правый равный 1 бит переменной X.(почему?) используйте это замечание для написания более быстрой версии функции BITCOUNT.
... основаниям. При этом философская абстракция языка оказывается неразрывно связана с основными темами и движениями философии в целом. Более конкретно, на ранние стадии традиционно рассматриваемого в рамках АФ анализа обыденного языка глубокое влияние оказала философия Дж. Э. Мура, особенно его учение о здравом смысле, согласно которому такие понятия, как «человек», «мир», «я», «внешний мир», « ...
... и других странах СНГ, а также облегчение доступа к русской и мировой культуре и науке. Таким образом, судя по данным наших исследований, востребованность русского языка осталась в республике достаточно высокой. Многие представители современной молдавской молодежи продолжают, как их отцы и деды, тянуться к русской культуре, научным и техническим достижениям России. Русский язык остается языком ...
... рисуночное словесно-слоговое письмо). Памятники среднеэламского периода (14—12 вв. до н.э.) выполнены аккадской клинописью. Памятники новоэламского периода относятся к 8—6 вв. до н.э. Был официальным языком в персидском государстве Ахеменидов в 6—4 вв. предполагается, что он, подвергшись влиянию древнеперсидского, сохранился до раннего средневековья. 7. Бурушаски язык Язык бурушаски ( ...
... /диалект), скифский, согдийский, среднеперсидский, таджикский, таджриши (язык/диалект), талышский, татский, хорезмийский, хотаносакский, шугнано-рушанская группа языков, ягнобский, язгулямский и др. Они относятся к индоиранской ветви индоевропейских языков. Области распространения: Иран, Афганистан, Таджикистан, некоторые районы Ирака, Турции, Пакистана, Индии, Грузии, Российской Федерации. Общее ...
0 комментариев