- •Обзорные лекции по курсу
- •Арифметические операции
- •Int main()
- •Int main ()
- •Логические операции
- •Операторы сравнения
- •Int main ()
- •If(проверяемое_условие)
- •Int main ()
- •Int main()
- •If(проверяемое_условие)
- •Int main()
- •Int main ()
- •Int main ()
- •Int main ()
- •Int main()
- •Int.Main ()
- •Int main ()
- •Int main ()
- •Int main ()
- •Int main ()
- •Int main ()
- •Int main ()
- •Int main ()
- •Int main()
- •If(проверяемое_условие)
- •Int main ()
- •If(проверяемое_условие)
- •If(проверяемое_условие)
Int main ()
{
cout « "Size of int type: ";
cout « sizeof (int) « '\n';
cout « "Size of float type: ";
cout « sizeof(float) « '\n';
cout « "Size of double type: ";
cout « sizeof(double) « '\n';
cout « "Size of char type: ";
cout « sizeof(char) « '\n';
return 0;
}
Поразрядные логические операции
В практике программирования приходится отслеживать состояния различных программных объектов с помощью вспомогательных переменных, которые стали называть флагами. Для этой цели можно использовать булевские переменные. Однако, если у вас слишком много признаков, удобнее в качестве флагов использовать отдельные биты переменных. Для ПК на платформе Intel один байт представляет собой восемь бит информации, а каждый бит может принимать значение 0 или 1. Таким образом, в одном байте может быть закодировано любое целое число от 0 до 255 включительно (28 = 256). Биты в байте считаются справа налево.
Рассмотрим, например, панель из пяти переключателей SW1 ... SW5 Можно было бы объявить в качестве флагов 5 переменных типа bool (по 1 байту на каждый объект). Каждый выключатель может принимать состояние "включено" (1 - true) или "выключено" (0 - false).
bool SW1, SW2, SW3, SW4, SW5;
Тогда, проверяя значения указанных выше переменных, можно судить о состоянии того или иного переключателя.
Принимая во внимание тот факт, что биты в байте также могут принимать значения только нуля или единицы, используя компактную запись, эту же панель можно было бы уместить всего в одном байте.
Рис. 3.1. Вариант установки значений битовых переменных в байте.
Для того, чтобы программист мог свободно адресоваться к отдельным битам, предложены специальные поразрядные логические операции, приведенные в табл. 3.1.
Таблица 3.1.
Поразрядные логические операции
-
&
логическое И (умножение)
I
логическое ИЛИ (сложение)
^
исключающее ИЛИ
~
логическое НЕ (инверсия)
Результат применения оператора "логическое И" (умножение) к двум битам равен единице только тогда, когда оба операнда установлены в единицу (см. табл. 2.2).
Таблица 3.2.
Операция "логическое И"
-
А
В
С = А&В
0
0
0
0
1
0
1
0
0
1
1
1
При логическом ИЛИ (сложении) результат равен единице, если хотя бы один из участвующих в операции бит установлен в единицу (см. табл. 3.3).
Таблица 3.3.
Операция "логическое ИЛИ"
-
А
B
С = АIВ
0
0
0
0
1
1
1
0
1
1
1
1
В таблице 3.4 показано, что исключающее ИЛИ (иногда для упрощения понимания называют "исключительно ИЛИ") возвращает единицу только в том случае, если операнды не равны (первый операнд - единица, а второй-ноль или наоборот).
Таблица 3.4.
Операция "исключающее ИЛИ"
-
А
B
С = А^В
0
0
0
0
1
1
1
0
1
1
1
0
Операция "логическое НЕ" (см. табл. 3.5) инвертирует биты (меняет исходное логическое значение на противоположное). Если исходный бит установлен, после применения к нему данной операции он сбрасывается. И наоборот, если бит сброшен в ноль, логическое НЕ установит его в единицу.
Таблица 3.5.
Операция "логическое НЕ"
-
А
С = ~А
0
1
1
0
Вернемся к примеру с панелью переключателей и отведем для всей панели однобайтную переменную, например, типа char:
char SW = 0;
Присвоив первоначально переменной SW значение 0 (или в двоичном виде 00000000), мы тем самым указываем, что все переключатели находятся в выключенном состоянии.
Теперь предположим, что необходимо включить третий переключатель на панели (SW3 на рис. 3.1), т.е. надо сделать так, чтобы переменная SW в двоичном виде выглядела как 00000100(или в шестнадцатеричном виде 0x04). Для этого применим для этого операцию "логическое ИЛИ":
SW = SW | 0x04; // включить SW3
Аналогичным образом включим первый выключатель:
SW = SW | 0x01; // включить SW1
Предположим, что по ходу программы значение байта SW изменялось каким-то образом и перед нами стала задача выключить третий и первый переключатели, не имея информации об их текущем состоянии. Для сброса(перевода в 0) отдельных бит в байте на практике применяют операцию "логическое И".
SW = SW & 0xFA; // FA16 = 111110102
И в заключение изменим состояние четвертого выключателя на противоположное, независимо от его исходного значения, применив операцию "исключающее ИЛИ":
SW = SW ^ 0x08; // 0816 = 000010002
В практике программирования часто используется сокращенная форма записи присвоения результата поразрядных логических операторов:
& = //побитовое И с присваиванием
| =// побитовое логическое ИЛИ с присваиванием
^ = //побитовое исключающее ИЛИ с присваиванием
Операции сдвига влево и вправо
Для осуществления сдвига последовательности бит влево и вправо применяются соответственно операции « и ». Операнд справа от знака операции указывает, на какую величину должны быть сдвинуты биты, задавая тем самым количество бит, "выводимых" из переменной, и число нулевых бит, заполняющих переменную с другой стороны.
Рис. 3.2. Пример установки значений битов в байте.
Например:
unsigned char A = 12; // А = 000011002
А = А « 2; // А = 001100002
А = А » 3; // А = 000001102
Следует учитывать, что при использовании правого сдвига, если самый старший бит равен единице (признак отрицательного числа у переменных со спецификатором signed), некоторые компиляторы могут не "ввести" нули слева. Это связано с тем, что, чтобы избежать подобных ситуаций, рекомендуется преобразовывать операнд операции в беззнаковый тип (unsigned).