Двоичное вычитание - PullRequest
       56

Двоичное вычитание

0 голосов
/ 16 ноября 2010

Скажем, я собираюсь вычесть: 0000 0000 - (-1)

, то есть: (два дополнения)

      0000 0000
    - 1111 1111
      ---------
    = ???? ????

Что случится, мой мозг действительно f *** со мной прямо сейчас, все прошло прекрасно, я думаю, это переполнение, которое облажает меня, кто-то может дать некоторое разрешение на это, пожалуйста:)?

Ответы [ 5 ]

6 голосов
/ 16 ноября 2010

Возьмите дополнение двух к вычитаемому и добавьте его к наименьшему.

  0000 0000
- 1111 1111

 ...

  0000 0000
+ 0000 0001
-----------
  0000 0001
0 голосов
/ 16 ноября 2010

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

Вы можете сделать это в стиле карандаша и бумаги, где вы позаимствуете число рядом с ним, но оно выглядит немного глупо по сравнению с десятичными числами.С десятичными числами, скажем, 1000 минус 1, ноль справа становится 10, потому что это основание 10, тогда 0 рядом с ним должен заимствовать, а также сделать 10, но затем одолжить одно вправо, сделав 9, этопродолжается до тех пор, пока ваша верхняя строка не станет 9 9 10, и вы вычтете 0 0 1 и получите 999. С основанием 2 0b1000 (что является восьмым десятичным знаком) минус 0b0001, то же самое происходит, что ноль справа занимает слева или становится 2 или 0b10, потому чтоэто основание 2, ноль рядом с ним должен занимать, а также становится 0b10, затем смещает единицу вправо, превращая его в 1 и т. д., так что ваша верхняя строка равна 1 1 0b10, а нижняя строка равна 0 0 1, вычтитестолбцов и вы получите 0b111 или 7 десятичных дробей.

Таким образом, все нули минус все, верхняя строка равна 1 1 1 1 1 1 1 0b10 после первого заимствования, нижняя строка остается равной 0 0 0 0 0 00 0, вычтите столбцы и вы получите 0 0 0 0 0 0 0 1.

0 голосов
/ 16 ноября 2010

Будет (-11..11).Как и в десятичных числах, знак по-прежнему является знаком, а (0-x) по-прежнему (-x), если вы не используете побитовую операцию вместо простого вычитания.

0 голосов
/ 16 ноября 2010

Моя интуиция подсказывает мне, что 0 - (-1) должно быть равно 0+1 или просто 1.

Если вам интересно, почему, попробуйте выполнить вычитание по битам:

0 - 1          = 10 - 1     = 1, setting borrow to 1.
0 - 1 - borrow = 10 - 1 - 1 = 0, borrow = 1
etc..

И лучше не делать двоичного вычитания вручную. Идея дополнения 2s состоит в том, чтобы предоставить простой способ выполнения вычитания, добавив вместо этого обратную величину.

0 голосов
/ 16 ноября 2010

Вы можете вычесть -1 (двоичный код 1111 1111), добавив дополнение к его двум, равное 1 (двоичный код 0000 0001). Таким образом, в десятичном виде 0 - (- 1) = 0 + 1 = 1: -)

...