Урок #4

Побітові операції

Цей урок є одним з найскладніших уроків для новачків. Чому? Через-необхідність добре орієнтуватись у новій системі числення. Якщо Ви вже знайомі з двійковою системою, то можете пропустити першу частину уроку.

Пишемо одинички і нулики

Загальновідомо, що кожна система числення має базис. Наприклад, у десятковій, якою ми користуємося щодня, базис – 10. І кожне число ми можемо представити у вигляді a*10 + b*10^2 + … + x*10^n. У двійковій системі числення все точно так же, але з числом 2. Давайте спробуємо представити число 123 в десятковій системі.

123 = 3 * 10^0 + 2 * 10 + 1 * 10^2

Який же вигляд прийме число 123 в двійковій системі? Для цього скористаємося простим алгоритмом. Візьмемо число, яке є степенем двійки, менше заданого нам числа і найбільш наближене до нього. У нашому випадку це 64. Тепер віднімаємо від нашого числа 64 і отримаємо 59. Тепер дивимося, чи зможемо ми відняти від цього числа число з меншим степенем двійки – число 32? Відповідь позитивна – тому віднімаємо і отримаємо 27. І так далі, поки у нас не залишиться 0. Отже, від числа 123 ми віднімали числа 64, 32, 16, 8, 2 і 1. Нагадую, що будь-яке число в нульовому степені – 1. Зауважимо, що від нашого числа ми не віднімали 4. Тепер потрібно задатися питанням: «Числа з якими степенями двійки ми віднімали?». Це були переважно 6, 5, 4, 3, 1 і 0. Якщо написати на їх місці одинички, а на всіх інших – нулики, то отримаємо число 1111011. Це і є число 123, але в двійковій системі Зауважимо, що цей так званий «швидкий» метод працює виключно при переведенні числа з десяткової у двійкову систему.

Як відомо, будь-яка цифра в будь-якій системі числення не може перевищувати її базис.

Чудово, ми тепер розібралися з двійковою системою числення. Але чому саме вона обрана для комп’ютерів? Це тому, що комп’ютери повністю побудовані на логічних командах. Їх всього дві: true і false, або «є сигнал» і «немає сигналу» відповідно. Якщо сигнал є, отримуємо 1, якщо ні – 0.

Побітові операції з числами

Як і зі звичайними логічними змінними, ми можемо виконувати ті ж операції і з числами. Ви запитаєте: «Як це? Логічні операції ми виконуємо тільки зі змінними логічного типу!» Але і звичайні числа теж можна «зробити логічними». Для цього будь-яке число необхідно перевести в двійкову систему. Але ж кожен знак цього числа і є логічною змінною. Це не означає, що ми зможемо «витягнути» будь-який знак числа і використовувати в програмі як логічну змінну, а просто всі операції будуть виконуватися відповідно з операціями булевського типу.

Сподіваюсь, з теорією ми розібрались. Перейдемо до практики.

Ви ще не встигли забути логічні оператори &&, ||, ! та ^. Давайте ж переробимо одну з логічних операцій на побітову. Припустимо, це буде операція І. Але вона позначається не двома знаками &, а тільки одним. Біт – найменша частинка кодування, 1/8 байта. Кожна цифра в двійковій системі числення – один біт. Отже, розглянемо всі побітові оператори на прикладі чисел 10 і 7.

Вираз Значення Пояснення
10 & 7 2 В двійковій системі число 10 має вигляд 1010, а число 7 – 0111. Проводячи операцію логічного І з цими числами, отримаємо число 0010, що в десяткової системі – 2
10 | 7 15 Тут використовується той же принцип, тільки з операцією логічного АБО. Отримуємо число 1111
10 ^ 7 13 Оператор ^ – це оператор виключає АБО. Тобто якщо два порівнюваних значення однакові, то результат дорівнює 0, тобто false, якщо різні – true, інакше кажучи – 1. В результаті виконання 10 ^ 7 отримаємо число 1101, тобто 13
~10 -11 Дана операція відрізняється від усіх інших тим, що вона унарна. Особливості цього оператора ми розглянемо після таблички
10 >> 3 1 Оператор зсуву вправо відповідно переміщує все біти числа вправо. При цьому всі біти, які виявляються за межами байта просто відпадають, а місце, що звільнилося в кінці біта (якщо вважати за кінець біта ту частину, де ступінь двійки більше) забивається нулями
10 << 3 80 В даному випадку відбувається те ж саме але в зворотному напрямку

Таким чином, ми розглянули в даній таблиці все побітові оператори. Але деякі ми так повністю і не вивчили. Це оператор ~, який переводить всі біти числа в протилежні. Проте в даному випадку нам нічого не говорить, що число від’ємне, але це завжди так., що це число – від’ємне . Якщо ми будемо наразі розбиратись в представленні від’ємного числа у комп’ютері, то цей урок буде тривати кілька годин.

Але, як ми бачимо, при операції ~а, де а – довільно число стандартного типу, ми отримуємо число – (а + 1). Тому, для того, щоб отримати число, протилежне даному, треба всього лише написати ~а + 1, де а знову грає роль будь-якого числа базового типу. Спробуйте зробити це самостійно.

Найпростіше шифрування

Будь-яка державна установа – використовує шифрування даних. Звичайно, можна придумати всілякі алгоритми шифрування, але один з них є найпростішим і не кожен зможе його швидко розгадати. Давайте розглянемо числа (в двійковій системі) 10011101 і 11110001. Виконаємо операцію виключає АБО з цими числами. Отримаємо число 01101100. Але що буде, якщо ми знову виконаємо операцію ^ нашого результату з другим числом? Ми отримаємо число 10011101, що і є нашим початковим числом. Круто, чи не так?

Можливі питання за темою:

Питань ще нема

Додавайте свої питання в коментарі. Кращі потраплять до статті 🙂


Урок #3 Урок #5