Проста математика, яка лежить в основі алгоритмів десятково-двійкового перетворення
Якщо ви шукаєте в Інтернеті How to convert from decimal to binary, ви знайдете чотири прості алгоритми: два для цілих чисел і два для дробів. Вони представлені на прикладах нижче в першій частині статті. Але хоча просто знати алгоритми майже завжди достатньо, я вирішив спробувати зрозуміти, чому вони працюють. У другій частині цієї статті пояснюється основна математика, що лежить в основі кожного з них. Знання цього може допомогти вам запам’ятати будь-який з алгоритмів, якщо ви раптом їх забудете. Я настійно пропоную вам взяти блокнот і ручку і виконувати операції разом зі мною, щоб краще запам’ятати математику. Ось чотири алгоритми з прикладами, які ви можете знайти в Інтернеті.
Перетворення цілого десяткового числа на двійкове
Щоб перетворити ціле число на двійкове, почніть із відповідного цілого числа та поділіть його на 2, зважаючи на частку та залишок. Продовжуйте ділити частку на 2, поки не отримаєте нульову частку. Потім просто запишіть залишки у зворотному порядку.
Ось приклад такого перетворення з використанням цілого числа 12. Спочатку поділимо число на два, вказавши частку та залишок:
Тепер нам просто потрібно виписати залишок у зворотному порядку — 1100. Отже, 12 у десятковій системі представлено як 1100 у двійковій.
Перетворення десяткового дробу в двійковий
Щоб перетворити дріб від 0 до 1 у двійковий, кілька разів помножте дробову частину на 2 і запишіть кожну отриману цілу частину. Прочитайте ці цифри в порядку після двійкової точки. Зупиніться, коли дробова частина дорівнює нулю або коли у вас буде достатньо бітів: такі дроби, як 0,1, вічно повторюються у двійковому форматі.
Ось приклад такого перетворення за допомогою дробу 0,375.
Тепер давайте просто випишемо отриману цілу частину на кожному кроці — 0,011. Отже, 0,375 у десятковій системі представлено як 0,011 у двійковій.
Перетворення двійкового цілого числа в десяткове
Щоб перетворити двійкове ціле число в десяткове, почніть зліва. Візьміть поточну суму, помножте її на два та додайте поточну цифру. Продовжуйте, доки не залишиться цифр. Ось приклад такого перетворення з використанням цілого числа 1011.
Перетворення двійкового дробу в десятковий
Щоб перетворити двійковий дріб у десятковий, почніть праворуч із підсумку 0. Візьміть поточну суму, додайте поточну цифру та розділіть результат на 2. Продовжуйте, доки не залишиться цифр. Ось приклад такого перетворення за допомогою дробу 0,1011. Я просто замінив ділення на 2 множенням на 1/2.
У вас є 4 простих алгоритму, які дозволять вам перетворити двійкові числа в десяткові і назад.
Розкладання числа за основою q
Ключем до розуміння того, чому ці алгоритми працюють, є розширення числа за основою q. Ціле число в будь-якій системі числення можна представити в такому вигляді:
де N — ціле число, x — цифра (від 0 до 9 для системи з основою 10, 0 і 1 для системи з основою 2), q є базовим значенням (10 для системи з основою 10, 2 для системи з основою 2).
У цій статті ця форма називається розкладом числа N за основою q або просто розкладом за основою q. Давайте подивимося, як виглядає число 12 в десятковій і двійковій системах числення:
Так само дробове число в будь-якій системі числення можна представити в такому вигляді:
де N – дріб, x – цифра (від 0 до 9 для системи з основою 10, 0 і 1 для системи з основою 2), q – це базове значення (10 для системи з основою 10, 2 для системи з основою 2).
Для числа 0,375 в десятковій і двійковій системах подання таке:
Перетворення цілого десяткового числа на двійкове
Як виявилося, ми можемо використовувати цю форму розширення base-q для перетворення числа з десяткової системи у двійкову. Давайте зробимо це для того самого числа 12. По-перше, давайте удамо, що не знаємо, як це представлено у двійковому вигляді, і запишемо це, замінивши невідомі цифри на x:
Наше завдання знайти всі x. Давайте подивимося, що ми можемо тут зробити. Перше, на що ми повинні звернути увагу, що всі доданки, крім останнього, будуть парними числами, тому що всі вони кратні двом. Тепер, використовуючи цю інформацію, ми можемо зробити висновок про цифру для x0 — якщо ціле число, яке перетворюється, парне, то x0 дорівнює 0, якщо воно непарне — тоді x0 має бути 1. Тут ми маємо число 12, яке є парним, тому x0 дорівнює нулю. Давайте запишемо цю інформацію:
Далі нам потрібно знайти значення для x1. Оскільки всі доданки від x1 до xN кратні двом, ми можемо винести 2, щоб виділити x1. Давайте зробимо це:
Також легко побачити, що сума значень у дужках дорівнює 6. Отже, ми можемо записати наш перший крок так:
Продовжуємо з’ясовувати x, що залишилися. Ми можемо записати поліном у дужках як окремий оператор:
Тут, застосовуючи ту саму логіку вище, ми можемо побачити, що x1 дорівнює 0. Давайте перепишемо це і знову розкладемо 2 на множники:
Отже, наш другий крок:
Тепер ми можемо побачити закономірність. Ми можемо продовжувати розкладати 2 на множники, поки частка не дорівнюватиме нулю. Давайте підемо за цією схемою і подивимось, що ми отримаємо.
Оскільки частка дорівнює 1, залишився лише один доданок, тому перепишемо попередній вираз:
Отже, наш третій крок:
Отже, ми маємо наступне:
Зрозуміло, що x3 дорівнює 1. Але, оскільки для нашого алгоритму нам потрібна частка, давайте перепишемо попередній вираз так, щоб вона мала частку:
Оскільки ми отримуємо частку 0, більше нема з чим працювати, і це був наш останній крок. Давайте випишемо це:
Отже, ми завершили перетворення. Ось як виглядає наше перетворення покроково:
Тепер зрозуміло, що залишок на кожному кроці відповідає значенню x у відповідних позиціях: перший залишок відповідає першому x, другий залишок – другому x і так далі. Отже, число 12 у двійковій системі за допомогою описаного вище алгоритму представляється як 1100.
Пам’ятайте, що ми почали з ідеї показати, чому працює алгоритм, який передбачає ділення на 2. Давайте виконаємо кроки, описані вище, і перемістимо 2 у ліву частину виразів:
Отже, таким чином ви можете побачити, як ми дійшли до алгоритму, описаного на початку. Ми також можемо об’єднати обчислення для цих чотирьох кроків в одне представлення, як це
Переконайтеся, що ви розумієте, як ми отримуємо це представлення, оскільки воно нам знадобиться, коли ми досліджуватимемо, як працює алгоритм перетворення з двійкової системи в десяткову.
Перетворення десяткового дробу в двійковий
Щоб показати, чому ми множимо на 2 і беремо цілу частину під час перетворення дробів у двійкові, я також використовуватиму форму розширення для дробів. Я буду використовувати дробове число 0,375 з першої частини статті. Подібно до цілої частини, давайте уявимо, що не знаємо, як це число представлено у двійковій формі, і запишемо його, замінивши невідомі цифри на x:
Як і у випадку з цілими числами, наше завдання полягає в тому, щоб знайти всі x, виділяючи x. Давайте подивимося, як ми можемо це зробити. Перше, на що слід звернути увагу, це те, що негативні ступені 2 дають нам дроби зі знаменником 2 із позитивними степенями. Давайте перепишемо наведений вище вираз:
Одразу очевидно, що ми можемо просто винести 1/2 у праву частину виразу. Давайте зробимо це:
а потім ми можемо перемістити 1/2 у ліву частину
Гаразд, тут ми виділили x1, і ми знаємо, що це може бути або 1, або 0. Щоб визначити, яку цифру він має, розглянемо решту доданків:
Давайте подумаємо, наскільки великою може бути сума цих чисел. Якщо максимальна кількість цифр x дорівнює 1, ми можемо просто замінити x на 1 і записати суму так:
Ця скінченна геометрична сума строго менша за 1. Вона наближається до 1 зі збільшенням кількості членів, але ніколи не досягає її для скінченного n. Отже, решта цифр вносять лише дробову частину:
Тепер має бути зрозуміло, що якщо права частина менша за 1, то x1 не може дорівнювати 1, тому вона дорівнює 0, тоді як частина, що залишилася, дорівнює 0,75.
Ось так виглядає перший крок алгоритму, представленого на початку:
Давайте вилучимо дробову частину 0,75 і розкладемо ще 1/2, щоб виділити x2:
і перемістіть 1/2 вліво:
Тепер, якщо x2 дорівнює 0, тоді сума правої частини виразу не може бути більшою за 1, але ліва частина дорівнює 1,5, тому x2 має бути 1, а частина, що залишилася, 0,5. Давайте випишемо це:
Знову ж таки, це слідує шаблону в алгоритмі, представленому на початку:
Повторюємо ті ж дії для решти дробової частини 0,5.
Використовуючи ту саму логіку, що й вище, ми можемо побачити, що x3 дорівнює 1 і немає жодної дробової частини:
Оскільки дробова частина, що залишилася, дорівнює 0, ось як виглядає наш останній крок:
Тож запишемо всі кроки ще раз:
Це саме той алгоритм, який я представив на початку. Так само, як ми робили з цілими числами, ми також можемо помістити обчислення для цих трьох кроків в одне представлення таким чином:
Знову ж таки, важливо, щоб ви повністю зрозуміли це представлення, оскільки воно нам знадобиться під час вивчення двійкового перетворення в десяткове.
Чому не всі дроби можна скінченно представити у двійковому вигляді
Раціональне число має скінченний розклад за основою q, якщо його зменшений знаменник ділить деякий ступінь q. У десятковій системі це означає, що єдиними простими множниками знаменника є 2 і 5; у двійковій системі це має бути ступінь 2. Наприклад, 0,625 можна записати зі знаменником 10³:
і не може скінченно представляти 1/3:
Те саме стосується системи base-2:
Але якщо ми перевіримо 0,1, знаменник дорівнює 10 і це не ступінь 2, тому 0,1 буде нескінченним дробом у двійковій системі. Давайте подивимося на це за алгоритмом, який ми вивчили вище:
Ми можемо продовжувати робити це нескінченно, але давайте запишемо це як повторюване двійкове розширення:
Перетворення двійкового цілого числа в десяткове
Я збираюся використовувати те саме двійкове ціле число 1011 з першого розділу, щоб показати вам, чому працює алгоритм множення на 2. Тут ми також будемо використовувати форму розгортання base-q числа. Запишемо це в такому вигляді:
Усі члени, крім останньої цифри, мають коефіцієнт 2. Неодноразово вилучайте 2 з членів вищого порядку, залишаючи кожну останню цифру поза дужками:
Тепер, якщо ви просто дотримуєтеся порядку математичних операцій, ви отримаєте точно такі самі кроки, як я показав на початку, зокрема:
Таким чином 1011 у двійковій системі дорівнює 11 у десятковій системі.
Перетворення двійкового дробу в десятковий
Ось ми підійшли до останнього алгоритму. Напевно, ви вже самі зрозуміли, що за цим стоїть. Якщо ні, давайте подивимося, чому це працює. Ключовою тут також є форма розгортання числа на основі q. Ми візьмемо число 0,1011 з першого розділу. Запишемо це в розгорнутому вигляді:
Знову ж таки, оскільки всі доданки кратні 1/2, ми можемо продовжувати вилучати 1/2, доки не залишиться дробової частини. Давайте зробимо це:
Дотримуючись порядку математичних операцій, виходить алгоритм, описаний на початку:
Таким чином 0,1011 у двійковій системі дорівнює 0,6875 у десятковій системі.