Как сложить числа в двоичной системе: разбор столбиком
Дано: два двоичных числа и , разрядная сетка 8 бит. Найти: их сумму в двоичной записи, перенос в каждом разряде и проверку ответа переводом в десятичную систему.
Складывают двоичные числа ровно так же, как десятичные, - столбиком справа налево, с переносом в старший разряд. Отличие одно: разряд переполняется уже на двойке, потому что цифр всего две. Ответ: , то есть , а перенос возникает в семи разрядах подряд. Калькулятор сверху открыт ровно на этих числах: на разрядной сетке видно, где загорается перенос, а второй режим собирает ответ обратно в десятичное число.
Решение по шагам
Дано. , . Найти: в двоичной системе.
Шаг 1. Выравниваем числа по разрядам. В первом числе семь значащих цифр, во втором шесть. Чтобы разряды не разъехались, дописываем слева незначащие нули до общей длины. Возьмём привычную сетку в один байт:
Ведущие нули на величину не влияют, зато теперь каждый столбец столбика - это один и тот же вес у обоих слагаемых. Разряды нумеруются справа налево начиная с нуля: младший имеет вес , старший в байте - вес .
Шаг 2. Вспоминаем правило для одного разряда. В двоичной системе всего четыре варианта сложения двух цифр, и только последний даёт перенос:
| Сумма | Записываем | Перенос | ||
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 1 | 1 | 0 |
| 1 | 0 | 1 | 1 | 0 |
| 1 | 1 | 0 | 1 |
Последняя строка и есть вся суть: , а двойки как цифры в этой системе нет, поэтому в разряде остаётся ноль, а единица уходит наверх. Если в разряд пришёл ещё и перенос, складываются три цифры, и вариантов становится два: даёт единицу в разряде и единицу в перенос.
Шаг 3. Идём столбиком справа налево. В каждом разряде считаем , где - перенос, пришедший из младшего разряда. Остаток от деления этой суммы на два записываем в ответ, целую часть от деления на два отправляем дальше:
| Разряд | Вес | Перенос | Сумма | Цифра ответа | Перенос дальше | ||
|---|---|---|---|---|---|---|---|
| 0 | 1 | 1 | 1 | 0 | 2 | 0 | 1 |
| 1 | 2 | 1 | 1 | 1 | 3 | 1 | 1 |
| 2 | 4 | 0 | 1 | 1 | 2 | 0 | 1 |
| 3 | 8 | 1 | 0 | 1 | 2 | 0 | 1 |
| 4 | 16 | 1 | 1 | 1 | 3 | 1 | 1 |
| 5 | 32 | 0 | 1 | 1 | 2 | 0 | 1 |
| 6 | 64 | 1 | 0 | 1 | 2 | 0 | 1 |
| 7 | 128 | 0 | 0 | 1 | 1 | 1 | 0 |
Обрати внимание на четвёртый столбец: перенос не гаснет ни разу с нулевого по шестой разряд. Такая цепочка - нормальное явление, именно из-за неё сложение в процессоре нельзя выполнить строго параллельно по всем битам.
Шаг 4. Собираем ответ. Читаем шестой столбец снизу вверх, от старшего разряда к младшему: 1, 0, 0, 1, 0, 0, 1, 0. Перенос из седьмого разряда равен нулю, поэтому дописывать девятую цифру не нужно.
Ответ: .
Формула переноса и откуда она берётся
Правило столбика - это запись числа по степеням основания. Любое двоичное число раскладывается в сумму , и при поразрядном сложении в разряде накапливается величина , которая может дойти до трёх. Цифра в позиционной записи обязана быть меньше основания, поэтому лишнее переезжает в соседний разряд:
Деление на два законно, потому что единица разряда весит ровно вдвое больше единицы разряда . В десятичной системе работает та же формула, только с десяткой: там переполнение наступает на десяти, здесь - на двойке, оттого переносы в двоичной записи встречаются заметно чаще.
Через логические операции те же две строки выглядят так: цифра ответа равна исключающему «или» трёх входов, а перенос - их мажоритарной функции, то есть единице, когда единиц среди трёх входов хотя бы две. Из этих двух функций и собран одноразрядный сумматор в железе; если нужно потренироваться на таблицах истинности отдельно, есть разбор построения таблицы истинности с тем же формализмом.
Проверка через десятичную систему
Проверять двоичную арифметику удобнее всего переводом в десятичную: там ошибку видно сразу. Раскладываем каждое слагаемое по весам разрядов, где стоят единицы:
Обычное десятичное сложение даёт . Теперь разворачиваем полученный ответ: в числе единицы стоят в седьмом, четвёртом и первом разрядах, значит
Числа сошлись, решение верное. Второй режим калькулятора сверху показывает эту же проверку графиком: столбики - веса единичных разрядов, линия набирает итог нарастающим счётом и заканчивается на 146. Если линия пришла не туда, где ждёшь, значит потерян перенос в одном из разрядов, и искать его надо там, где столбики расходятся с ручным расчётом.
Вычитание: дополнительный код вместо занимания
Отдельное правило вычитания в двоичной системе учить не нужно: машина его и не использует. Вместо занимания из старшего разряда вычитаемое заменяют дополнительным кодом, а дальше выполняют то же самое сложение столбиком. Для нашего примера: инвертируем все биты числа и прибавляем единицу, получается . Складываем столбиком:
Девятая цифра за пределами байта отбрасывается, остаётся , и это верный ответ: . Почему инвертирование с прибавлением единицы работает как смена знака и как при этом ведёт себя старший бит, подробно разобрано в статье про представление отрицательных чисел в дополнительном коде - здесь важно лишь то, что схема сложения остаётся прежней.
Переполнение разрядной сетки
Пока сумма помещается в отведённые разряды, всё честно. Но разрядность в вычислениях конечна, и перенос из старшего разряда деваться некуда. Сложим два однобайтовых числа и : истинная сумма равна 300, а в восьми разрядах помещаются значения только до . Из седьмого разряда выходит единица, и в регистре остаётся , то есть .
Отсюда практическое правило: перед сложением прикинь верхнюю границу ответа и сравни её с ёмкостью сетки. В калькуляторе сверху за это отвечает переключатель разрядности: на 8 битах пара 200 и 100 подсвечивается как переполнение, на 12 и 16 битах та же сумма проходит без потерь. В беззнаковой арифметике признаком служит перенос из старшего разряда, в знаковой - расхождение переноса в старший разряд и переноса из него.
Частые ошибки
- Записывают 2 в разряде. Цифры 2 в двоичной системе нет: даёт 0 и перенос, а не «двойку».
- Теряют перенос при длинной цепочке. В нашем примере он идёт через семь разрядов подряд; выписывай его отдельной строкой над столбиком, а не держи в голове.
- Не выравнивают числа по правому краю. Слагаемые разной длины дополняются нулями слева; сдвиг на один разряд меняет ответ вдвое.
- Забывают последний перенос. Если из старшего разряда вышла единица и сетка не ограничена, ответ становится на разряд длиннее, как .
- Молча игнорируют переполнение. При фиксированной разрядности сумма берётся по модулю , и результат 44 вместо 300 - не ошибка расчёта, а свойство сетки.
- Проверяют ответ тем же способом, каким считали. Повторный проход по столбику воспроизведёт ту же ошибку, а перевод в десятичную систему её покажет.
FAQ
Чем двоичное сложение отличается от десятичного? Только моментом переполнения разряда. Алгоритм тот же: справа налево, с переносом в старший разряд. В десятичной системе перенос появляется, когда сумма разряда дошла до десяти, в двоичной - когда до двух, поэтому переносов в двоичной записи намного больше.
Как сложить три и более двоичных числа? Последовательно: сначала первые два, потом к результату третье и так далее. Складывать три числа в одном столбике тоже можно, но тогда сумма разряда доходит до трёх с переносом, а перенос может быть равен двум, и в одном разряде его уже не записать.
Нужно ли переводить числа в десятичную систему, чтобы их сложить? Нет, и в этом весь смысл: столбик работает прямо в двоичной записи. Перевод нужен только для проверки ответа, и как раз потому, что он идёт другим путём.
Что делать, если результат не помещается в разрядную сетку? Либо расширить сетку (взять 16 разрядов вместо 8), либо принять арифметику по модулю и отслеживать флаг переноса. Двоичная запись сама по себе длины не ограничивает, ограничение приходит от формата хранения; тот же приём с разрядной сеткой используется в быстром возведении в степень по модулю.
Коротко
- Выровняй слагаемые по правому краю, дописав слева нули до общей разрядности: и .
- Иди справа налево и в каждом разряде считай : цифра ответа - остаток от деления на два, перенос - целая часть.
- Помни правило разряда: , , , .
- Проверь ответ переводом в десятичную систему: и .
- Ответ: , перенос возникает в семи разрядах, в байт результат помещается без переполнения.
Похожие задачи
Как реализовать дек: пошаговое решение
Как реализовать дек на кольцевом массиве: формулы индексов head и tail через остаток от деления, трассировка push и pop с обоих концов, вариант на двусвязном списке, сложность операций.
Программирование/алгоритмыКак вычислить числа Фибоначчи: решение по шагам
Как вычислить числа Фибоначчи: рекуррентная формула, итеративный проход за n минус одно сложение, проверка формулой Бине через золотое сечение и цена наивной рекурсии.
Программирование/алгоритмыКак определить сложность алгоритма: пошаговое решение
Как определить сложность алгоритма по коду: считаем итерации вложенных циклов и цикла с делением пополам, оставляем главный член, проверяем оценку удвоением n и кратко разбираем основную теорему.
Орг./аналит. химияОкисление перманганатом калия: реакции в трёх средах
Как написать окисление перманганатом калия в кислой, нейтральной и щелочной средах: продукты восстановления марганца, метод электронного баланса, расстановка коэффициентов, расчёт титранта.
Химия (физич./структурная)Как найти активность иона: расчёт по Дебаю-Хюккелю
Как найти активность иона в растворе: ионная сила по всем ионам, коэффициент активности по предельному закону Дебая-Хюккеля, произведение f на c, разбор с числами и калькулятор.
ГенетикаКак найти частоту генотипов: закон Харди-Вайнберга
Разбор задачи по популяционной генетике: как найти частоту генотипов по закону Харди-Вайнберга, формула p2 плюс 2pq плюс q2, расчёт числа особей и калькулятор частот.