Способы вычитания двоичных чисел

Двоичный калькулятор онлайн

Данный калькулятор может производить следующие действия над двоичными числами:

Сложение двоичных чисел

Сложение двух двоичных чисел производится столбиком поразрядно. Начиная с младшего разряда (справа на лево), как и при сложении столбиком десятичных чисел. Но так как цифр всего две (0 и 1), их сложение происходит по следующим правилам:

Пример

Для примера сложим 1011 и 101:

+ 1 0 1 1
1 0 1
1 0 0 0 0

Вычитание двоичных чисел

Вычитание двоичных чисел производится аналогично сложению – столбиком, но по следующим правилам:

Пример

Для примера вычтем из числа 1011 число 101:

1 0 1 1
1 0 1
1 1 0

Умножение двоичных чисел

Умножение двоичных чисел производится в столбик аналогично умножению в десятичной системе, но по следующим правилам:

Пример

Для примера перемножим числа 1011 и 101:

× 1 0 1 1
1 0 1
+ 1 0 1 1
0 0 0 0
1 0 1 1
1 1 0 1 1 1

Деление двоичных чисел

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

Источник

Двоичная система счисления

Содержание:

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

Двоичной системой счисления называется позиционная система счисления, у которой основанием является число 2.

Для записи любого числа в двоичной системе счисления используются всего лишь 2 цифры: 0 и 1.

Общая форма записи двоичных чисел

Для целых двоичных чисел можно записать:

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

Правила сложения двоичных чисел

Основные правила сложения однобитовых чисел

Отсюда видно, что и, как и в десятичной системе счисления, числа, представленные в двоичной системе счисления, складывают поразрядно. Если разряд переполняется, единица переносится в следующий разряд.

Пример сложения двоичных чисел

Правила вычитания двоичных чисел

Но как быть с 0-1=? Вычитание двоичных чисел немного отличается от вычитания десятичных чисел. Для этого используется несколько способов.

Вычитание методом заимствования

Запишите двоичные числа друг под другом – меньшее число под большим. Если меньшее число имеет меньше цифр, выровняйте его по правому краю (так, как вы записываете десятичные числа при их вычитании).
Некоторые задачи на вычитание двоичных чисел ничем не отличаются от вычитания десятичных чисел. Запишите числа друг под другом и, начиная справа, найдите результат вычитания каждой пары чисел.

Вот несколько простых примеров:

1 — 0 = 1
11 — 10 = 1
1011 — 10 = 1001

Рассмотрим более сложную задачу. Вы должны запомнить только одно правило, чтобы решать задачи на вычитание двоичных чисел. Это правило описывает заимствование цифры слева, чтобы вы могли вычесть 1 из 0 (0 — 1).

В первом столбце справа вы получаете разность 0 — 1. Для ее вычисления необходимо позаимствовать цифру слева (из разряда десятков).

Во-первых, зачеркните 1 и замените ее на 0, чтобы получить такую задачу: 1010 — 101 = ?
Вы вычли («позаимствовали») 10 из первого числа, поэтому вы можете написать это число вместо цифры, стоящей справа (в разряд единиц). 101100 — 101 = ?
Вычтите цифры в правом столбце. В нашем примере:
101100 — 101 = ?

Правый столбец: 10 — 1 = 1.
102 = (1 x 2) + (0 x 1) = 210 (цифры нижнего регистра обозначают систему счисления, в которой записаны числа).
12 = (1×1) = 110.

Таким образом, в десятичной системе эта разность записывается в виде: 2 — 1 = 1.

Вычтите цифры в оставшихся столбцах. Теперь это легко сделать (работайте со столбцами, двигаясь, справа налево):

101100 — 101 = __1 = _01 = 001 = 1.

Вычитание методом дополнения

Запишите двоичные числа друг под другом так, как вы записываете десятичные числа при их вычитании. Этот метод используется компьютерами для вычитания двоичных чисел, так как он основан на более эффективном алгоритме.

Однако простому человеку, привыкшему вычитать десятичные числа, этот метод может показаться более сложным (если вы программист, обязательно познакомьтесь с этим методом вычитания двоичных чисел).


Рассмотрим пример: 1011002 — 111012= ?

Если значность чисел разная, к числу с меньшей значностью слева припишите соответствующее количество 0.


1011002 — 0111012= ?

В вычитаемом числе поменяйте цифры: каждую 1 поменяйте на 0, а каждый 0 на 1.

0111012 → 1000102.

На самом деле мы «забираем дополнение у единицы», то есть вычитаем каждую цифру из 1. Это работает в двоичной системе, так как у такой «замены» может быть только два возможных результата: 1 — 0 = 1 и 1 — 1 = 0.

К полученному вычитаемому прибавьте единицу.

1000102+ 12 = 1000112

Теперь вместо вычитания сложите два двоичных числа.

1011002 +1000112= ?

Проверьте ответ. Быстрый способ – откройте двоичный онлайн калькулятор и введите в него вашу задачу. Два других метода подразумевают проверку ответа вручную.

1) Переведем числа в двоичную систему счисления:
Допустим, что из числа 1011012 нужно вычесть 110112

2) Обозначим как A число 1011012 и как B число 110112.

3) Запишем числа A и B столбиком, одно под другим, начиная с младших разрядов (нумерация разрядов начинается с нуля).

Источник

Вычитание двоичных чисел

Сложение двоичных чисел

Двоичные числа складываются по правилам, приведенным в таблице:

Пример:

Сложить два числа 11110010 и 10101010

Вычитание двоичных чисел

Вычитания двоичных чисел заменим сложением. Сначала преобразуем вычитаемое в дополнительный код. Для получения дополнительного кода, сначала инвертируем число, а потом к нему прибавим двоичную единицу. Инвертировать число, значит, записать его в обратном коде, т. е. там, где были единицы записать 0, а где были нули — записать единицы. Операцию инвертирования обозначим добавлением к числу частицы NOT. NOT10101010 = 01010101. К обратному коду прибавим 1 и получим: 1010110 (первый ноль можно опустить). 10101100 — это дополнительный код числа 10101010.

Пример 1:
11110010-10101010 ?

  • Получим обратный код not10101010=10101010
  • Дополнительный код:
    10101010+1=10101011
  • Сложим 11110010+1010110=1001000 (старший разряд отбрасываем, так как разрядность результата должна быть равна 8 двоичным разрядам, как уменьшаемое и ведущий ноль не пишем).

Пример 2:
110 — 11 ?

Если разрядность вычитаемого меньше, чем разрядность уменьшаемого, то к вычитаемому надо сначала слева дописать недостающие нули, чтобы разрядности чисел были одинаковыми, а потом получать его обратный код.

  • Допишем ноль слева 11 = 011
  • NOT011 = 100
  • Дополнительный код 100 + 1 = 101
  • Сложим 110 + 101 = 1011, старшую единицу отбрасываем, т. к. сохраняем разрядность уменьшаемого, ноль в начале числа можно не писать.
  • Ответ 110 — 11 = 11

Еще один интересный способ выполнения вычитания связан с понятием дополнительного кода, который позволяет свести вычитание к сложению. Получается число в дополнительном коде исключительно просто, берём число, заменяем нули на единицы, единицы наоборот заменяем на нули и к младшему разряду добавляем единицу. Например, 10010, в дополнительном коде будет 011011.

Правило вычитания через дополнительный код утверждает, что вычитание можно заменить на сложение если вычитаемое заменить на число в дополнительном коде.

Пример: 34 — 22 = 12

Запишем этот пример в двоичном виде. 100010 — 10110 = 1100

Дополнительный код числа 10110 будет такой

01001 + 00001 = 01010. Тогда исходный пример можно заменить сложением так 100010 + 01010 = 101100 Далее необходимо отбросить одну единицу в старшем разряде. Если это сделать то, получим 001100. Отбросим незначащие нули и получим 1100, то есть пример решён правильно.

Дополнительный код (представление числа)

Материал из Википедии — свободной энциклопедии

Это версия страницы, ожидающая проверки. Последняя подтверждённая версия датируется 21 января 2010.

Дополнительный код (англ. two’s complement, иногда twos-complement) — наиболее распространённый способ представления отрицательных целых чисел в компьютерах. Он позволяет заменить операцию вычитания на операцию сложения и сделать операции сложения и вычитания одинаковыми для знаковых и беззнаковых чисел, чем упрощает архитектуру ЭВМ. Дополнительный код отрицательного числа можно получить инвертированием модуля двоичного числа (первое дополнение) и прибавлением к инверсии единицы (второе дополнение). Либо вычитанием числа из нуля.

Дополнительный код (дополнение до 2) двоичного числа получается добавлением 1 к младшему значащему разряду его дополнения до 1. [1]

Дополнение до 2 двоичного числа определяется как величина полученная вычитанием числа из наибольшей степени двух (из 2 N для N-битного дополнения до 2). [2]

Источник

Информатика и информационные технологии: конспект лекций.

Арифметические операции над целыми двоичными числами.

Сложение двоичных чисел без знака.

Микропроцессор выполняет сложение операндов по правилам сложения двоичных чисел. Проблем не возникает до тех пор, пока значение результата не превышает размерности поля операнда. Например, при сложении операндов размером в байт результат не должен превышать число 255. Если это происходит, то результат оказывается неверным. Рассмотрим, почему так происходит.

К примеру, выполним сложение: 254 + 5 = 259 в двоичном виде. 11111110 + 0000101 = 1 00000011. Результат вышел за пределы 8 бит и правильное его значение укладывается в 9 бит, а в 8-битовом поле операнда осталось значение 3, что, конечно, неверно. В микропроцессоре этот исход сложения прогнозируется и предусмотрены специальные средства для фиксирования подобных ситуаций и их обработки. Так, для фиксирования ситуации выхода за разрядную сетку результата, как в данном случае, предназначен флаг переноса сf. Он располагается в бите 0 регистра флагов ЕFLАGS/FLАGS. Именно установкой этого флага фиксируется факт переноса единицы из старшего разряда операнда. Естественно, что программист должен учитывать возможность такого исхода операции сложения и предусматривать средства для корректировки. Это предполагает включение участков кода после операции сложения, в которых анализируется флаг сf. Анализ этого флага можно провести различными способами.

Самый простой и доступный – использовать команду условного перехода jсс. Эта команда в качестве операнда имеет имя метки в текущем сегменте кода. Переход на эту метку осуществляется в случае, если в результате работы предыдущей команды флаг сf установился в 1. В системе команд микропроцессора имеются три команды двоичного сложения:

1) inс операнд – операция инкремента, т. е. увеличения значения операнда на 1;

2) аdd операнд_1, операнд_2 – команда сложения с принципом действия: операнд_1 = операнд_1 + операнд_2;

3) аdс операнд_1, операнд_2 – команда сложения с учетом флага переноса сf. Принцип действия команды: операнд_1 = операнд_1 + операнд_2 + значение_сГ.

Обратите внимание на последнюю команду – это команда сложения, учитывающая перенос единицы из старшего разряда. Механизм появления такой единицы мы уже рассмотрели. Таким образом, команда аdс является средством микропроцессора для сложения длинных двоичных чисел, размерность которых превосходит поддерживаемые микропроцессором длины стандартных полей.

Сложение двоичных чисел со знаком.

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

1) флаг переноса сf, установка которого в 1 говорит о том, что произошел выход за пределы разрядности операндов;

2) команду аdс, которая учитывает возможность такого выхода (перенос из младшего разряда).

Другое средство – это регистрация состояния старшего (знакового) разряда операнда, которое осуществляется с помощью флага переполнения оf в регистре ЕFLАGS (бит 11).

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

00687 = 00000010 10101111.

31253 = 01111010 00010101.

Следим за переносами из 14 и 15-го разрядов и правильностью результата: переносов нет, результат правильный.

1132 = 11101110 11001100.

Произошел перенос из 14-го разряда; из 15-го разряда переноса нет. Результат неправильный, так как имеется переполнение – значение числа получилось больше, чем то, которое может иметь 16-битное число со знаком (+32 767).

-30566 = 10001000 10011010.

-04875 = 11101100 11110101.

-35441 = 01110101 10001111.

Произошел перенос из 15-го разряда, из 14-го разряда нет переноса. Результат неправильный, так как вместо отрицательного числа получилось положительное (в старшем бите находится 0).

-4875 = 11101100 11110101.

-4875 = 11101100 11110101.

09750 = 11011001 11101010.

Есть переносы из 14 и 15-го разрядов. Результат правильный.

Таким образом, мы исследовали все случаи и выяснили, что ситуация переполнения (установка флага ОF в 1) происходит при переносе:

1) из 14-го разряда (для положительных чисел со знаком);

2) из 15-го разряда (для отрицательных чисел).

И наоборот, переполнения не происходит (т. е. флаг ОF сбрасывается в 0), если есть перенос из обоих разрядов или перенос отсутствует в обоих разрядах.

Итак, переполнение регистрируется с помощью флага переполнения оf. Дополнительно к флагу оf при переносе из старшего разряда устанавливается в 1 и флаг переноса СF Так как микропроцессор не знает о существовании чисел со знаком и без знака, то вся ответственность за правильность действий с получившимися числами ложится на программиста. Проанализировать флаги СF и ОF можно командами условного перехода JС\JNС и JО\JNО соответственно.

Что же касается команд сложения чисел со знаком, то они те же, что и для чисел без знака.

Вычитание двоичных чисел без знака.

Как и при анализе операции сложения, порассуждаем над сутью процессов, происходящих при выполнении операции вычитания. Если уменьшаемое больше вычитаемого, то проблем нет, – разность положительна, результат верен. Если уменьшаемое меньше вычитаемого, возникает проблема: результат меньше 0, а это уже число со знаком. В этом случае результат необходимо завернуть. Что это означает? При обычном вычитании (в столбик) делают заем 1 из старшего разряда. Микропроцессор поступает аналогично, т. е. занимает 1 из разряда, следующего за старшим, в разрядной сетке операнда. Поясним на примере.

05 = 00000000 00000101.

-10 = 00000000 00001010.

Для того чтобы произвести вычитание, произведем.

Воображаемый заем из старшего разряда:

Тем самым, по сути, выполняется действие.

(65 536 + 5) – 10 = 65 531.

0 здесь как бы эквивалентен числу 65536. Результат, конечно, неверен, но микропроцессор считает, что все нормально, хотя факт заема единицы он фиксирует установкой флага переноса сf. Но посмотрите еще раз внимательно на результат операции вычитания. Это же -5 в дополнительном коде! Проведем эксперимент: представим разность в виде суммы 5 + (-10).

5 = 00000000 00000101.

(-10)= 11111111 11110110.

Т. е. мы получили тот же результат, что и в предыдущем примере.

Таким образом, после команды вычитания чисел без знака нужно анализировать состояние флага СЕ Если он установлен в 1, то это говорит о том, что произошел заем из старшего разряда и результат получился в дополнительном коде.

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

1) dес операнд – операция декремента, т. е. уменьшения значения операнда на 1;

2) sub операнд_1, операнд_2 – команда вычитания; ее принцип действия: операнд_1 = операнд_1 – операнд_2;

3) sbb операнд_1, операнд_2 – команда вычитания с учетом заема (флага сi): операнд_1 = операнд_1 – операнд_2 – значение_сГ.

Как видите, среди команд вычитания есть команда sbb, учитывающая флаг переноса сf. Эта команда подобна аdс, но теперь уже флаг сf исполняет роль индикатора заема 1 из старшего разряда при вычитании чисел.

Вычитание двоичных чисел со знаком.

Здесь все несколько сложнее. Микропроцессору незачем иметь два устройства – сложения и вычитания. Достаточно наличия только одного – устройства сложения. Но для вычитания способом сложения чисел со знаком в дополнительном коде необходимо представлять оба операнда – и уменьшаемое, и вычитаемое. Результат тоже нужно рассматривать как значение в дополнительном коде. Но здесь возникают сложности. Прежде всего они связаны с тем, что старший бит операнда рассматривается как знаковый. Рассмотрим пример вычитания 45 – (-127).

Вычитание чисел со знаком 1.

Судя по знаковому разряду, результат получился отрицательный, что, в свою очередь, говорит о том, что число нужно рассматривать как дополнение, равное —44. Правильный результат должен быть равен 172. Здесь мы, как и в случае знакового сложения, встретились с переполнением мантиссы, когда значащий разряд числа изменил знаковый разряд операнда. Отследить такую ситуацию можно по содержимому флага переполнения оf. Его установка в 1 говорит о том, что результат вышел за диапазон представления знаковых чисел (т. е. изменился старший бит) для операнда данного размера, и программист должен предусмотреть действия по корректировке результата.

Вычитание чисел со знаком 2.

-45–45 = -45 + (-45)= -90.

Здесь все нормально, флаг переполнения оf сброшен в 0, а 1 в знаковом разряде говорит о том, что значение результата – число в дополнительном коде.

Вычитание и сложение операндов большой размерности.

Если вы заметили, команды сложения и вычитания работают с операндами фиксированной размерности: 8, 16, 32 бит. А что делать, если нужно сложить числа большей размерности, например 48 бит, используя 16-разрядные операнды? К примеру, сложим два 48-разрядных числа:

Рис. 29. Сложение операндов большой размерности.

На рисунке 29 по шагам показана технология сложения длинных чисел. Видно, что процесс сложения многобайтных чисел происходит так же, как и при сложении двух чисел «в столбик», – с осуществлением при необходимости переноса 1 в старший разряд. Если нам удастся запрограммировать этот процесс, то мы значительно расширим диапазон двоичных чисел, над которыми мы сможем выполнять операции сложения и вычитания.

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

В завершение обсуждения команд сложения и вычитания отметим, что кроме флагов сf и оf в регистре еflаgs есть еще несколько флагов, которые можно использовать с двоичными арифметическими командами. Речь идет о следующих флагах:

1) zf – флаг нуля, который устанавливается в 1, если результат операции равен 0, и в 1, если результат не равен 0;

2) sf – флаг знака, значение которого после арифметических операций (и не только) совпадает со значением старшего бита результата, т. е. с битом 7, 15 или 31. Таким образом, этот флаг можно использовать для операций над числами со знаком.

Умножение чисел без знака.

Для умножения чисел без знака предназначена команда.

Как видите, в команде указан всего лишь один операнд-сомножитель. Второй операнд-сомножитель_2 задан неявно. Его местоположение фиксировано и зависит от размера сомножителей. Так как в общем случае результат умножения больше, чем любой из его сомножителей, то его размер и местоположение должны быть тоже определены однозначно. Варианты размеров сомножителей и размещения второго операнда и результата приведены в таблице 10.

Источник

Читайте также:  Способы охраны объектов тэк
Оцените статью
Разные способы