C. Тема 1. Раздел 4
.pdfБитовый сдвиг – все биты числа сдвигаются на указанное количество двоичных разрядов влево или вправо, освободившиеся разряды обычно заполняются нулями
0x0ff << 4 → 0xff0
0xff0 >> 4 → 0x0ff
0xfffffff0 >> 4 → ?
▪Возможны варианты: 0xffffffff и 0x0fffffff
Битовый сдвиг – идеальный способ получения степеней двойки, а также целочисленного деления и умножения на степени двойки
0xffff0000 & 0x12345678 0x12340000
0xffff0000 | 0x12345678 0x12345678
0xf0f0f0f0 ^ 0x0f0f0f0f 0xffffffff
Ложь – это 0, а истина – не 0
Сравнение двух чисел
5 == 10 → 0
10 == 10 → не 0
5!=10 → не 0
10 != 10 → 0
5 < 10 → не 0
5 > 10 → 0
Логические операции
0 < 10 && 10 < 100 → не 0
0 < 10 && 10 < 5 → 0
Как ввести TRUE и FALSE?
Использовать символические константы
Как упростить: a = a + 10? Это просто: a +=10
А как упростить: a = a << 2, a = a * 5, a = a / 10,
a = a % 2, a = a & 0x0000ffff?
Вы ещё не догадались?
Применение
e1, e2
Сначала выполняется выражение e1, потом выражение е2
Значением всего выражения является значение выражения е2
Пример
int i = 10, j = 3;
|
|
|
|
|
|
|
|
|
Наименование |
Описание |
|
|
|
|
|
|
- |
Изменение знака числа |
|
|
|
|
|
|
++ -- |
Инкрементация, декрементация |
|
|
|
|
|
|
~ |
Битовое отрицание |
|
|
|
|
|
|
! |
Логическое отрицание |
|
|
|
|
|
|
& |
Получение адреса |
|
|
|
|
|
|
* |
Разадресация |
|
|
|
|
|
|
sizeof |
Определение размера требуемой памяти в байтах |
|
|
|
|
|
Как упростить: a = a + 1? Можно так: a += 1
Или ещё проще: a++
Как упростить: a = a - 1? Элементарно: a--
В чём разница префиксной и постфиксной инкрементации?
Для простейших выражений, типа i++; или ++i; – никакой
Для более сложных выражений:
int i = 0;
int a = i++ + 10; // i = 1, a = 10 int b = ++i - 1; // i = 2, b = 1
Битовое отрицание
~0x00000000 → 0xffffffff
~0xffffffff → 0x00000000
~0x0f0f0f0f → 0xf0f0f0f0
Логическое отрицание
!0xffffffff → 0
!0 → не 0
!0x0f0f0f0f → 0
Пример из жизни:
Маленький файл можно быстро перекинуть с флэшки на флэшку.
Большой файл, например, фильм, с флэшки на флэшку перекидывать долго, поэтому быстрей перекинуть адрес страницы в Интернете, с которой можно скачать этот фильм
То же самое и для переменных
Маленькие по размеру переменные можно быстро копировать целиком и хранить в стеке
Большие по размеру переменные долго копировать, в стек они не всегда влезают, поэтому быстрей их передавать по ссылке
Важное отличие – если хотим, чтобы кто-то поменял значение нашей переменной, то нужно передавать не копию переменной, а ссылку на неё или её адрес