EssayAI
Блог
Блог

Как сложить числа в двоичной системе: разбор столбиком

Запрос

Дано: два двоичных числа 101101121011011_2 и 1101112110111_2, разрядная сетка 8 бит. Найти: их сумму в двоичной записи, перенос в каждом разряде и проверку ответа переводом в десятичную систему.

Складывают двоичные числа ровно так же, как десятичные, - столбиком справа налево, с переносом в старший разряд. Отличие одно: разряд переполняется уже на двойке, потому что цифр всего две. Ответ: 10110112+1101112=1001001021011011_2 + 110111_2 = 10010010_2, то есть 91+55=14691 + 55 = 146, а перенос возникает в семи разрядах подряд. Калькулятор сверху открыт ровно на этих числах: на разрядной сетке видно, где загорается перенос, а второй режим собирает ответ обратно в десятичное число.

Решение по шагам

Дано. A=10110112A = 1011011_2, B=1101112B = 110111_2. Найти: A+BA + B в двоичной системе.

Шаг 1. Выравниваем числа по разрядам. В первом числе семь значащих цифр, во втором шесть. Чтобы разряды не разъехались, дописываем слева незначащие нули до общей длины. Возьмём привычную сетку в один байт:

A=0101 10112,B=0011 01112.A = 0101\,1011_2, \qquad B = 0011\,0111_2.

Ведущие нули на величину не влияют, зато теперь каждый столбец столбика - это один и тот же вес 2k2^k у обоих слагаемых. Разряды нумеруются справа налево начиная с нуля: младший имеет вес 20=12^0 = 1, старший в байте - вес 27=1282^7 = 128.

Шаг 2. Вспоминаем правило для одного разряда. В двоичной системе всего четыре варианта сложения двух цифр, и только последний даёт перенос:

aka_kbkb_kСуммаЗаписываемПеренос
00000
01110
10110
1110210_201

Последняя строка и есть вся суть: 1+1=21 + 1 = 2, а двойки как цифры в этой системе нет, поэтому в разряде остаётся ноль, а единица уходит наверх. Если в разряд пришёл ещё и перенос, складываются три цифры, и вариантов становится два: 1+1+1=1121 + 1 + 1 = 11_2 даёт единицу в разряде и единицу в перенос.

Шаг 3. Идём столбиком справа налево. В каждом разряде считаем ak+bk+cka_k + b_k + c_k, где ckc_k - перенос, пришедший из младшего разряда. Остаток от деления этой суммы на два записываем в ответ, целую часть от деления на два отправляем дальше:

Разряд kkВесaka_kbkb_kПеренос ckc_kСуммаЦифра ответаПеренос дальше
01110201
12111311
24011201
38101201
416111311
532011201
664101201
7128001110

Обрати внимание на четвёртый столбец: перенос не гаснет ни разу с нулевого по шестой разряд. Такая цепочка - нормальное явление, именно из-за неё сложение в процессоре нельзя выполнить строго параллельно по всем битам.

Шаг 4. Собираем ответ. Читаем шестой столбец снизу вверх, от старшего разряда к младшему: 1, 0, 0, 1, 0, 0, 1, 0. Перенос из седьмого разряда равен нулю, поэтому дописывать девятую цифру не нужно.

0101 10112+0011 01112=1001 00102.0101\,1011_2 + 0011\,0111_2 = 1001\,0010_2.

Ответ: 10110112+1101112=100100102=146101011011_2 + 110111_2 = 10010010_2 = 146_{10}.

Формула переноса и откуда она берётся

Правило столбика - это запись числа по степеням основания. Любое двоичное число раскладывается в сумму ∑ak⋅2k\sum a_k \cdot 2^k, и при поразрядном сложении в разряде kk накапливается величина sk=ak+bk+cks_k = a_k + b_k + c_k, которая может дойти до трёх. Цифра в позиционной записи обязана быть меньше основания, поэтому лишнее переезжает в соседний разряд:

dk=sk mod 2,ck+1=⌊sk2⌋.\begin{aligned} d_k &= s_k \bmod 2, \\ c_{k+1} &= \left\lfloor \frac{s_k}{2} \right\rfloor . \end{aligned}

Деление на два законно, потому что единица разряда k+1k+1 весит ровно вдвое больше единицы разряда kk. В десятичной системе работает та же формула, только с десяткой: там переполнение наступает на десяти, здесь - на двойке, оттого переносы в двоичной записи встречаются заметно чаще.

Через логические операции те же две строки выглядят так: цифра ответа равна исключающему «или» трёх входов, а перенос - их мажоритарной функции, то есть единице, когда единиц среди трёх входов хотя бы две. Из этих двух функций и собран одноразрядный сумматор в железе; если нужно потренироваться на таблицах истинности отдельно, есть разбор построения таблицы истинности с тем же формализмом.

Проверка через десятичную систему

Проверять двоичную арифметику удобнее всего переводом в десятичную: там ошибку видно сразу. Раскладываем каждое слагаемое по весам разрядов, где стоят единицы:

10110112=64+16+8+2+1=91,1101112=32+16+4+2+1=55.\begin{aligned} 1011011_2 &= 64 + 16 + 8 + 2 + 1 = 91, \\ 110111_2 &= 32 + 16 + 4 + 2 + 1 = 55. \end{aligned}

Обычное десятичное сложение даёт 91+55=14691 + 55 = 146. Теперь разворачиваем полученный ответ: в числе 10010010210010010_2 единицы стоят в седьмом, четвёртом и первом разрядах, значит

100100102=128+16+2=146.10010010_2 = 128 + 16 + 2 = 146 .

Числа сошлись, решение верное. Второй режим калькулятора сверху показывает эту же проверку графиком: столбики - веса единичных разрядов, линия набирает итог нарастающим счётом и заканчивается на 146. Если линия пришла не туда, где ждёшь, значит потерян перенос в одном из разрядов, и искать его надо там, где столбики расходятся с ручным расчётом.

Вычитание: дополнительный код вместо занимания

Отдельное правило вычитания в двоичной системе учить не нужно: машина его и не использует. Вместо занимания из старшего разряда вычитаемое заменяют дополнительным кодом, а дальше выполняют то же самое сложение столбиком. Для нашего примера: инвертируем все биты числа 0011 011120011\,0111_2 и прибавляем единицу, получается 1100 10012=2011100\,1001_2 = 201. Складываем столбиком:

0101 10112+1100 10012=1 0010 01002.0101\,1011_2 + 1100\,1001_2 = 1\,0010\,0100_2 .

Девятая цифра за пределами байта отбрасывается, остаётся 0010 01002=360010\,0100_2 = 36, и это верный ответ: 91−55=3691 - 55 = 36. Почему инвертирование с прибавлением единицы работает как смена знака и как при этом ведёт себя старший бит, подробно разобрано в статье про представление отрицательных чисел в дополнительном коде - здесь важно лишь то, что схема сложения остаётся прежней.

Переполнение разрядной сетки

Пока сумма помещается в отведённые разряды, всё честно. Но разрядность в вычислениях конечна, и перенос из старшего разряда деваться некуда. Сложим два однобайтовых числа 1100 10002=2001100\,1000_2 = 200 и 0110 01002=1000110\,0100_2 = 100: истинная сумма равна 300, а в восьми разрядах помещаются значения только до 28−1=2552^8 - 1 = 255. Из седьмого разряда выходит единица, и в регистре остаётся 0010 11002=440010\,1100_2 = 44, то есть 300−256300 - 256.

Отсюда практическое правило: перед сложением прикинь верхнюю границу ответа и сравни её с ёмкостью сетки. В калькуляторе сверху за это отвечает переключатель разрядности: на 8 битах пара 200 и 100 подсвечивается как переполнение, на 12 и 16 битах та же сумма проходит без потерь. В беззнаковой арифметике признаком служит перенос из старшего разряда, в знаковой - расхождение переноса в старший разряд и переноса из него.

Частые ошибки

  • Записывают 2 в разряде. Цифры 2 в двоичной системе нет: 1+11 + 1 даёт 0 и перенос, а не «двойку».
  • Теряют перенос при длинной цепочке. В нашем примере он идёт через семь разрядов подряд; выписывай его отдельной строкой над столбиком, а не держи в голове.
  • Не выравнивают числа по правому краю. Слагаемые разной длины дополняются нулями слева; сдвиг на один разряд меняет ответ вдвое.
  • Забывают последний перенос. Если из старшего разряда вышла единица и сетка не ограничена, ответ становится на разряд длиннее, как 112+12=100211_2 + 1_2 = 100_2.
  • Молча игнорируют переполнение. При фиксированной разрядности сумма берётся по модулю 2n2^n, и результат 44 вместо 300 - не ошибка расчёта, а свойство сетки.
  • Проверяют ответ тем же способом, каким считали. Повторный проход по столбику воспроизведёт ту же ошибку, а перевод в десятичную систему её покажет.

FAQ

Чем двоичное сложение отличается от десятичного? Только моментом переполнения разряда. Алгоритм тот же: справа налево, с переносом в старший разряд. В десятичной системе перенос появляется, когда сумма разряда дошла до десяти, в двоичной - когда до двух, поэтому переносов в двоичной записи намного больше.

Как сложить три и более двоичных числа? Последовательно: сначала первые два, потом к результату третье и так далее. Складывать три числа в одном столбике тоже можно, но тогда сумма разряда доходит до трёх с переносом, а перенос может быть равен двум, и в одном разряде его уже не записать.

Нужно ли переводить числа в десятичную систему, чтобы их сложить? Нет, и в этом весь смысл: столбик работает прямо в двоичной записи. Перевод нужен только для проверки ответа, и как раз потому, что он идёт другим путём.

Что делать, если результат не помещается в разрядную сетку? Либо расширить сетку (взять 16 разрядов вместо 8), либо принять арифметику по модулю 2n2^n и отслеживать флаг переноса. Двоичная запись сама по себе длины не ограничивает, ограничение приходит от формата хранения; тот же приём с разрядной сеткой используется в быстром возведении в степень по модулю.

Коротко

  1. Выровняй слагаемые по правому краю, дописав слева нули до общей разрядности: 0101 101120101\,1011_2 и 0011 011120011\,0111_2.
  2. Иди справа налево и в каждом разряде считай ak+bk+cka_k + b_k + c_k: цифра ответа - остаток от деления на два, перенос - целая часть.
  3. Помни правило разряда: 0+0=00+0=0, 0+1=10+1=1, 1+1=1021+1=10_2, 1+1+1=1121+1+1=11_2.
  4. Проверь ответ переводом в десятичную систему: 91+55=14691 + 55 = 146 и 100100102=128+16+2=14610010010_2 = 128 + 16 + 2 = 146.
  5. Ответ: 10110112+1101112=1001001021011011_2 + 110111_2 = 10010010_2, перенос возникает в семи разрядах, в байт результат помещается без переполнения.
Задача в тетради или методичке? Сфотографируйте условие - сервис распознает его и решит по шагам с пояснениями.

Похожие задачи

Программирование/алгоритмы

Как реализовать дек: пошаговое решение

Как реализовать дек на кольцевом массиве: формулы индексов head и tail через остаток от деления, трассировка push и pop с обоих концов, вариант на двусвязном списке, сложность операций.

Программирование/алгоритмы

Как вычислить числа Фибоначчи: решение по шагам

Как вычислить числа Фибоначчи: рекуррентная формула, итеративный проход за n минус одно сложение, проверка формулой Бине через золотое сечение и цена наивной рекурсии.

Программирование/алгоритмы

Как определить сложность алгоритма: пошаговое решение

Как определить сложность алгоритма по коду: считаем итерации вложенных циклов и цикла с делением пополам, оставляем главный член, проверяем оценку удвоением n и кратко разбираем основную теорему.

Орг./аналит. химия

Окисление перманганатом калия: реакции в трёх средах

Как написать окисление перманганатом калия в кислой, нейтральной и щелочной средах: продукты восстановления марганца, метод электронного баланса, расстановка коэффициентов, расчёт титранта.

Химия (физич./структурная)

Как найти активность иона: расчёт по Дебаю-Хюккелю

Как найти активность иона в растворе: ионная сила по всем ионам, коэффициент активности по предельному закону Дебая-Хюккеля, произведение f на c, разбор с числами и калькулятор.

Генетика

Как найти частоту генотипов: закон Харди-Вайнберга

Разбор задачи по популяционной генетике: как найти частоту генотипов по закону Харди-Вайнберга, формула p2 плюс 2pq плюс q2, расчёт числа особей и калькулятор частот.