Калькулятор двійкових чисел
Обчислюйте з двійковими числами: додавання, віднімання, множення, ділення з остачею, побітові операції AND, OR, XOR, NOT, а також зсуви бітів уліво й управо. Введіть два двійкові значення й отримайте точні результати у двійковій, десятковій, шістнадцятковій і вісімковій системах, з покроковим розв’язанням.
Додавання, віднімання, множення та побітові операції з двійковими числами
Двійкова арифметика — основні правила
Де:
- \(b_i\) — окремий біт, тобто 0 або 1
- \(i\) — позиція біта, яку відраховують справа, починаючи з 0
- \(2^i\) — вага розряду (позиційна вага)
У двійкових числах використовують лише цифри 0 і 1, а кожна позиція має значення, кратне степеню 2. Арифметика працює точно так само, як десяткова, лише з таблицями розрядів за основою 2: при додаванні \(0+0=0\), \(0+1=1\), а \(1+1=10_2\) (записуємо 0, переносимо 1); при відніманні \(1-0=1\), \(1-1=0\), а \(0-1\) позичає 1 з наступного розряду (вартістю 2), щоб записати 1.
Побітові операції обчислюють так: кожен біт результату залежить лише від двох однойменних бітів операндів — ніби числа записали одне під одним. Зсув уліво на \(k\) позицій множить число на \(2^k\) у межах слова фіксованої розрядності, а арифметичний зсув управо на \(k\) ділить на \(2^k\) з округленням до \(-\infty\).
Калькулятор двійкових чисел — приклад обчислення
Приклад: додайте двійкові числа A = 1011 і B = 0110 (типові значення калькулятора).
Спочатку переведіть обидва числа в десяткову систему за вагами розрядів \(2^3, 2^2, 2^1, 2^0\):
\[ 1011_2 = 8 + 0 + 2 + 1 = 11_{10}, \qquad 0110_2 = 0 + 4 + 2 + 0 = 6_{10} \]
Тепер додавайте розряд за розрядом справа, переносячи 1 щоразу, коли сума в розряді досягає 2 або більше:
\[ 1011_2 + 0110_2 = 10001_2 \]
Перевірка в десятковій системі: \(11 + 6 = 17\), і справді \(10001_2 = 16 + 1 = 17\).
Результат: 10001 у двійковій системі, 17 у десятковій, 0x11 у шістнадцятковій та 0o21 у вісімковій.
Як користуватися калькулятором
- Виберіть Операцію зі спадного списку: додавання, віднімання, множення, ділення з остачею, одну з побітових операцій (AND, OR, XOR, NOT) або зсув бітів (A << B, A >> B).
- Введіть Перше число (A), використовуючи лише цифри 0 і 1; для від’ємних значень можна поставити мінус на початку. Пробіли всередині числа ігноруються.
- Так само введіть Друге число (B). Для NOT використовується лише A; для зсувів B — це величина зсуву (її також записують у двійковій системі).
- Для NOT, зсуву уліво та зсуву управо виберіть Розрядність (8, 16, 32 або 64 біти). Результат цих трьох операцій — слово у додатковому коді такої розрядності.
- Зчитайте Результати: відповідь у двійковій системі та її десяткові, шістнадцяткові й вісімкові еквіваленти. Для ділення також показується остача, а на панелі Кроки обчислення пояснено, як отримано відповідь.
Що таке двійкова арифметика
Двійкова система — це система числення цифрової техніки: біт дорівнює 0 або 1, тому що транзистор або закритий, або відкритий. Кожне двійкове число — це послідовність бітів, у якій позиція \(i\) справа має вагу \(2^i\). Тому 1011 — це не «тисяча одинадцять», а \(1\cdot8 + 0\cdot4 + 1\cdot2 + 1\cdot1 = 11\). Щойно ви починаєте читати числа таким чином, усі чотири базові операції виконуються звичним шкільним методом — просто перенос робиться при 2, а не при 10.
Побітові операції працюють інакше: вони обробляють кожен розряд незалежно, саме тому вони ідеально підходять для масок і прапорців. AND двох чисел зберігає лише біти, встановлені в обох; OR — біти, встановлені хоча б в одному; XOR — біти, встановлені рівно в одному. У таблиці нижче показано правило для окремого розряду:
| A | B | A AND B | A OR B | A XOR B |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 |
Зсуви — це двійковий спосіб масштабування на степені двійки. Зсув 1011 уліво на 2 дає 101100, тобто \(11 \times 4 = 44\) — за умови, що жоден біт не «випаде» за ліву межу слова. Саме тому розрядність має значення: у 32-бітному регістрі 1, зсунута уліво на 31, дає цілком коректний результат, але при зсуві на 32 біт зникає, і результат стає 0. Програмісти застосовують це всюди — від масок зображень до розподілу IP-підмереж, де калькулятор CIDR застосовує ту саму логіку бітових масок до діапазонів адрес.
Якщо вам потрібно перевести одне число з однієї системи в іншу, а не виконувати операції з двома числами, скористайтеся Конвертером двійкових чисел; Конвертер шістнадцяткових чисел робить те саме для шістнадцяткового запису, який програмісти часто обирають.
Припущення, обмеження та поради
- До 1024 бітів на введення. Всі обчислення виконуються в точній цілочисельній арифметиці, тож навіть дуже довгі двійкові числа дають точну відповідь — без округлень і переповнень в режимах додавання, віднімання, множення, ділення та побітових операцій.
- NOT і зсуви мають фіксовану розрядність. Вони обчислюються в межах обраної вами розмірності слова — точно так, як у регістрі процесора. Шістнадцяткові та вісімкові результати цих операцій показуються як беззнакові бітові шаблони цієї розрядності з ведучими нулями.
- Ділення усікається до нуля і повертає остачу — так само, як оператори
/та%у JavaScript, C і Java: A = B × Q + R, де |R| < |B|, а R має знак A. - Покрокові таблиці (рядки переносів, рядки позичань, побітові розряди) будуються для введених чисел довжиною до 64 бітів, а для множення — до 24 встановлених бітів у B; довші числа все одно обчислюються точно, просто без наочного покрокового розбору.
- Ведучі нулі нічого не змінюють чисельно —
0110і110обидва дорівнюють 6, — але для NOT і зсувів саме вони визначають форму слова, тож якщо вам важливе доповнення нулями, вказуйте розрядність явно. - Від’ємні числа приймаються лише у формі «знак–величина» (мінус на початку); калькулятор перетворює їх внутрішньо та показує результат зі знаком мінус, а не у вигляді шаблона додаткового коду (окрім режиму NOT і зсувів).
Часті запитання
Як перевести двійкове число в десяткове вручну?
Запишіть над кожним бітом степені 2 справа наліво: 1, 2, 4, 8, 16 тощо, а потім додайте ті степені, під якими стоїть 1. Наприклад, \(1101_2 = 8 + 4 + 0 + 1 = 13\). Крайній правий біт (позиція 0) завжди має вагу \(2^0 = 1\), а кожен крок уліво подвоює вагу.
Як покроково перевести десяткове число в двійкове?
Послідовно діліть число на 2, записуючи остачу на кожному кроці, доки не дійдете до 0. Потім зчитайте остачі знизу вгору. Для 13: \(13 \div 2 = 6\) остача 1, \(6 \div 2 = 3\) остача 0, \(3 \div 2 = 1\) остача 1, \(1 \div 2 = 0\) остача 1 — послідовність остач 1101 і є двійковою формою.
Чому в двійковій системі 1 + 1 = 10?
Бо в двійковій системі немає цифри 2. Коли сума розряду досягає 2, ви записуєте 0 в цьому розряді та переносите 1 в наступний розряд ліворуч — точнісінько як перенос у десятковій системі, коли суму розряду перевищує 9. Тож \(1 + 1 = 10_2\), що читається «один — нуль»: двійковий запис двійки (одна двійка плюс нуль одиниць).
У чому різниця між AND, OR і XOR?
Усі три порівнюють числа розряд за розрядом. AND дає 1 лише там, де обидва операнди мають 1 — зручно для видобуття або маскування бітів. OR дає 1 там, де хоча б один операнд має 1 — зручно для встановлення бітів. XOR дає 1 там, де рівно один операнд має 1 — зручно для перемикання бітів, причому XOR числа з самим собою завжди дорівнює 0.
Навіщо для NOT і зсувів обирати розрядність?
NOT і зсуви змінюють кількість бітів у результаті, тому відповідь залежить від розміру контейнера — так само, як і в регістрі процесора. У межах 8-бітного слова NOT 0000 0101 інвертує кожен біт, включно з ведучими нулями, і дає 1111 1010. Так само зсув уліво на k позицій множить число на \(2^k\) лише тоді, коли жоден біт не випадає за ліву межу слова, — інакше значення «перевертається».
Що відбувається з від’ємними числами у двійковій системі?
Цей калькулятор приймає від’ємні значення у записі з ведучим мінусом і обчислює точні результати зі знаком. Однак для операцій NOT і зсувів із фіксованою розрядністю від’ємні числа підпорядковуються конвенції додаткового коду, за якою \(-A\) зберігається як \(2^w - A\) у w-бітному слові, а NOT A дорівнює \(-A - 1\). Саме тому NOT 0 за будь-якої розрядності дає результат −1.
Які типові помилки при двійковій арифметиці вручну?
Забути перенос, коли сума розряду досягає 2; позичати 10 замість 2 під час віднімання; помилково зчитувати результат як десяткові цифри (1011 — це одинадцять, а не «тисяча одинадцять»). Також стежте за напрямком зсуву: зсув уліво множить на \(2^k\), а зсув управо — ділить, відкидаючи остачу: зсув 1011 (11) управо на 1 дає 101 (5), а не 22.
Чи дає двійкове ділення дробовий результат?
Ні — цей калькулятор виконує цілочисельне ділення з остачею, як оператори / і % у JavaScript, C чи Java. Частка усікається до нуля, а остача задовольняє рівність A = B × Q + R і має знак діленого. Ділення на нуль відхиляється з повідомленням про помилку, оскільки частка в такому разі не визначена.