- •Основные элементы языка Си
- •Константы
- •Константы целого типа
- •Задание.
- •Беззнаковые и длинные целые константы
- •Константы с плавающей точкой
- •Escape-последовательности
- •Символьные константы
- •Строковые константы
- •Задание.
- •Вопросы.
- •Основные операции языка Си
- •Общие положения
- •Арифметические операции
- •Унарные операции
- •Унарный минус
- •Операция унарный плюс.
- •Задание.
- •Операции инкремента и декремента
- •Задание.
- •Операции отношения и логические операции
- •Задание.
- •Операции присваивания
- •Примеры.
- •Задание.
- •Побитовые операции
- •Задание.
- •Логические побитовые операции
- •Задание.
- •Маскирование
- •Пример.
- •Задание.
- •Пример.
- •Задание.
- •Пример.
- •Пример.
- •Задание.
- •Пример.
- •Примеры.
- •Примеры.
- •Примеры.
- •Пример.
- •Задание.
- •Побочные эффекты. Приоритеты и порядок выполнения операций
- •Пример.
- •Пример.
-
Задание.
Известно, что коды строчных латинских букв меньше кодов прописных букв (в ASCII-таблице) на 32. Как с помощью маскирования можно преобразовывать прописные латинские буквы в строчные? Что будет, если операцию применить к строчной букве?
Второй тип маскирования требует скопировать часть разрядов из данной битовой последовательности в другую, а остальные биты заполнить единицами. Эту операцию можно выполнить с помощью побитового "или". Маска строится по принципу: в копируемые разряды заносятся нули, а в заполняемым единицами — единицы.
-
Пример.
Дано число a=0x6DB7.
Скопировать в b восемь левых бит, а восемь правых заполнить единицами.
а= 0110 1101 1011 0111
|
маска= 0000 0000 1111 1111
—————————————
b= 0110 1101 1111 1111
a = 0110 1101 1011 0111
|
маска = 0000 0000 1111 1111
—————————————
b= 0110 1101 1111 1111
Как и в первом случае, маска может оказаться зависящей от длины слова. Например, требуется скопировать восемь младших разрядов и заполнить единицами остальные. Это выполнятся одним из следующих способов:
b = а | 0хFF00 (зависит от длины слова)
или
b = а | 0хFF (не зависит от длины слова).
-
Задание.
Как с помощью маскирования можно преобразовывать строчные латинские буквы в прописные?
Третий тип маскирования — часть разрядов копируется в новое слово, а остальные разряды инвертируются.
-
Пример.
Дано число a=0х6DB7.
Скопировать в b восемь левых разрядов, а остальные инвертировать.
Задача решается с помощью " исключающего или": b=а^0хff
a = 0110 1101 1011 0111
^
маска = 0000 0000 1111 1111
—————————
b= 0110 1101 0100 1000 = 0х6D48
Маска здесь выбирается по следующему правилу: копируемым
разрядам соответствуют нули, а инвертируемым - единицы.
Если нужно скопировать старшие разряды (левые), а инвертировать правые, то это можно сделать одним из следующих способов:
b=a^0хFF00=0x92B7 (зависит от длины слова)
или
b=а^ 0хFF=0x92B7 (не зависит от длины слова).
Операцию "исключающее или" можно использовать как переключатель значения определенного бита при многократном выполнении операции с постоянным вторым операндом, содержащим 1 в соответствующем бите. Пусть вначале бит содержит нуль. Тогда после первого выполнения операции бит переключается в 1 (0^1=1), при втором он обнулится (1^1=0) и так далее.
0^1=1.
Теперь бит установлен в единицу и повторяя действие обнулим его
1^1=0 и т.д.
-
Пример.
Пусть a=0х6DB7 и дана маска = 0х4. Тогда
0х6DB7^0х4 = 0x6DB3 (обнуляется третий бит справа)
0х6DB3^0x4 = 0x6DB7 (третий бит вновь единица и т.д.).
-
Задание.
Как организовать переключение регистра для латинских букв?
Операции сдвига
В Си для побитового сдвига операнда имеется две операции:
<< — сдвиг влево
>> — сдвиг вправо
В каждой из них используется два операнда. Первый (левый) — это операнд
целого типа, представляющий битовую последовательность, которую
надо сдвинуть. Второй — беззнаковое целое, указывающее
количество позиций, на которые производится сдвиг. Это число не может
превышать по величине длину первого операнда.
При сдвиге влево биты, перемещаемые за пределы слова, теряются, а освобождающиеся справа разряды заполняются нулями.