Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
c-operators.doc
Скачиваний:
8
Добавлен:
09.11.2019
Размер:
154.62 Кб
Скачать

Задание.

1. Даны значения a=0х6DB7 и b=0xA726.

Найти a, b, а&b, а&b, а|b.

2. Каковы будут результаты следующих выражений, если x=03,

y=02, z=01:

а) x|y&z,

б)x|y&z, \hs27mm е)\hs1mm x|x,

в) x^y&x, \hs25mm ж)x^x.

г) x&y&&z,

д)!x|x,

Каждая из побитовых операций имеет свой собственный приоритет:

&,^,| (в порядке убывания).

Побитовые логические операции имеют приоритет выше логических && и ||, но ниже операций проверки равенства ( == и != )

Маскирование

Маскирование - это процесс преобразования данной битовой последовательности в другую с помощью побитовых логических операций.

Исходная битовая последовательность является левым операндом, а второй (правый) операнд называется маской — это специально подобранная битовая последовательность, которая должна обеспечить требуемое преобразование.

Применяется несколько различных типов маскирования, которые по смыслу выполняемых действий можно определить как "копирование и обнуление", "копирование и замена на единицы", "копирование и инвертирование".

  • копирование и обнуление;

  • копирование и замена на единицы;

  • копирование и инвертирование.

Например, "копирование и обнуление" означает, что часть разрядов заданной битовой последовательности должна быть скопирована в новое слово, а остальные биты в нем заполняются нулями. Т.о., соответствующие биты в исходном слове будут "замаскированы". Для этого типа маскирования используется операция &, а маска строится по принципу: в копируемые разряды заносим единицы, а в остальные — нули.

Пример

Дано a=0х6DB7 -- беззнаковое целое.

Требуется выделить в a шесть правых бит, остальные биты обнулить и результат

присвоить переменной b.

а = 0110 1101 1011 0111

маска = 0000 0000 0011 1111

——————————

b = 0000 0000 0011 0111 = 0х37

a = 0110 1101 1011 0111

маска = 0000 0000 0011 1111

—————————————

b= 0000 0000 0011 0111

Если выделяются младшие разряды в числе, то маска не зависит от длины машинного слова конкретной вычислительной системы, так как все старшие биты, независимо от их количества, будут заполняться нулями.

Если требуется выделить старшие разряды (левые), то значение, используемое в качестве маски, существенно зависит от длины слова.

Пример.

Значение b получается из a обнулением десяти младших разрядов и копированием остальных. Какую маску нужно использовать для этого?

b=а& 0хFC00= 0х6C00

Здесь маска 0хFC00 позволяет правильно выполнить нужные действия, только если используется 16-разрядное машинное слово, что снижает возможности переносимости программ.

Чтобы избежать привязки к длине слова, маскирование можно провести иным способом. Построим маску по принципу: в копируемые разряды заносим нули, в обнуляемые единицы и инвертируем полученное значение. Выйгрыш состоит в том, что в нашем примере единицы теперь нужно занести в младшие разряды, а не в старшие, как при старом подходе.

Тогда для обнуления десяти правых разрядов, маска выбирается теперь в виде 0х3FF. Длина слова для такой маски не играет роли (какая разница, сколько нулей должно быть слева от значащих цифр!). Решением будет

b=a& 0x3FF.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]