# 04 Лекция Полная версия [TOC] ## Деление > В си все операции происходят без изменения типов (делим целое на целое - получаем целое) > При делении целового на дробное - целое будет приведено к дробному, рузультат дробный **Округление к 0** (в отличие от Python) ``` int a = 7/3; // a = 2 int a = -7/3; // a = -2 ``` **Правило: `a/b * b + a%b == a`** ``` int a = 7%3; // a = 1 int a = -7%3; // a = -1 ``` Проверка на нечетность `a%2 == 1` **только для полож**\ `a%2 != 0` **для любых** При деление на 0 - [Undefined Behavior](https://ru.wikipedia.org/wiki/%D0%9D%D0%B5%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D1%91%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D0%BE%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5) (Может быть всё, что угодно) ## Побитовые операции ### Побитовое и (AND) Бинарная `a & b` `a = 12 & 6; // a == 4` ``` 1100 //== 12 & 0110 //== 6 == 0100 //== 4 ---- 3210 - степень двойки за которое овечает бит ---- 8421 - число за которое отвечает бит ---- ``` Таблица истинности: ``` 0 0 -> 0 0 1 -> 0 1 0 -> 0 1 1 -> 1 ``` ### Побитовое или (OR) Бинарная `a | b` `a = 12 | 6; // a == 14` ``` 1100 //== 12 | 0110 //== 6 == 1110 //== 14 ``` Таблица истинности: ``` 0 0 -> 0 0 1 -> 1 1 0 -> 1 1 1 -> 1 ``` ### Побитовое отрицание (NOT) Унарная `~a` `a = ~12; // a == 3` ``` ~ 1100 //== 12 = 0011 //== 3 ``` Таблица истинности: ``` 0 -> 1 1 -> 1 ``` ### Побитовое Исключающее ИЛИ (XOR) Бинарная `a ^ b` `a = 12 ^ 6; // a == 6` ``` 1100 //== 12 ^ 0110 //== 6 == 0110 //== 6 ``` Таблица истинности: ``` 0 0 -> 0 0 1 -> 1 1 0 -> 1 1 1 -> 0 ``` ### Штрих Шеффера (NAND - NOT AND - НЕ И) Бинарная `a = ~(12 & 6); //a == 3 Таблица истинности: ``` 0 0 -> 1 0 1 -> 1 1 0 -> 1 1 1 -> 0 ``` ### Стрелка Пирса (NOR - NOT OR - НЕ ИЛИ) Бинарная `a = ~(12 | 6); //a == 1 ``` 1100 //== 12 ^ 0110 //== 6 == 0110 //== 6 ``` Таблица истинности: ``` 0 0 -> 1 0 1 -> 0 1 0 -> 0 1 1 -> 0 ``` [Подробнее про побитывые операции](https://www.geeksforgeeks.org/bitwise-operators-in-c-cpp) Проверка на нечетность `(a&1) == 1` (если без "()" будет a&(1 == 1)) ``` 1100 == 12 & 0001 == 1 = 0000 == 0 ``` ``` 1101 == 13 & 0001 == 1 = 0001 == 1 ``` > К сожалению в стандарте приоритеты побитывых операций не те - которые хотелось бы, по этому можно часто встретить скобки рядом с такими операциями ## Логические операции ### Правило конвертирования: * 0 - false, не 0 - true * true - 1, false - 0 ### Логическое и `a = 0 && 0; // a == 0` `a = 0 && 6; // a == 0` `a = 12 && 0; // a == 0` `a = 12 && 6; // a == 1` ### Логическое или `a = 0 || 0; // a == 0` `a = 0 || 12; // a == 1` `a = 6 || 0; // a == 1` `a = 6 || 12; // a == 1` ### Логическое не `a = !true; // a == false` [Подробнее про логические операции](en.cppreference.com/w/cpp/language/operator_logical) ### Приведение к bool `!!a` (Если a = 0, то 0. есть a!=0, то 1) (два раза логическое не) ### Порядок вычисления аргументов *Сокращенное вычисление* Логическое и/или имеют определенный порядок вычисления аргументов! При логических операциях гарантируется:\ * `f() && g()` выполнение f вначале и проверка f не false\ (***если f() - FALSE, то `g()` считаться не будет! (`g()` не будет вызванно)***) * `f() || g()` выполнение f вначале и проверка f не true\ (***если f() - TRUE, то `g()` считаться не будет! (`g()` не будет вызванно)***)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up