- •Основные элементы языка Си Константы
- •Константы целого типа
- •Задание.
- •Беззнаковые и длинные целые константы
- •Константы с плавающей точкой
- •Escape-последовательности
- •Символьные константы
- •Строковые константы
- •Задание.
- •Вопросы.
- •Основные операции языка Си Общие положения
- •Арифметические операции
- •Унарные операции
- •Унарный минус
- •Операция унарный плюс.
- •Задание.
- •Операции инкремента и декремента
- •Задание.
- •Операции отношения и логические операции
- •Задание.
- •Операции присваивания
- •Примеры.
- •Задание.
- •Побитовые операции
- •Задание.
- •Логические побитовые операции
- •Задание.
- •Маскирование
- •Пример.
- •Задание.
- •Пример.
- •Задание.
- •Пример.
- •Пример.
- •Задание.
- •Пример.
- •Примеры.
- •Задание
- •Oперации присваивания и побитовые операции
- •Примеры.
- •Условная операция
- •Примеры.
- •Пример.
- •Задание.
- •Побочные эффекты. Приоритеты и порядок выполнения операций
- •Пример.
- •Пример.
Задание.
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.