2010-11-16 2 views
-1

Скажите, что я буду вычитать: 0000 0000 - (-1)Binary вычитание

что: (два дополнения)

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

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

+0

Язык !!! –

+0

@ The Elite Gentleman Простите его, рекурсия тяжелая :) – ruslik

+0

Я сказал, пожалуйста, по крайней мере;) – Skeen

ответ

6

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

0000 0000 
- 1111 1111 

... 

    0000 0000 
+ 0000 0001 
----------- 
    0000 0001 
0

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

+0

0 - 1 == -1; но если вы собираетесь использовать побитовую операцию, то 0 - 1 == 1 и 10 - 1 == 11 (двоичный). – Vladimir

+0

Действительно ли это второе дополнение? -1 = 1111 1111 двоичное право, поэтому вы выполняете дополнение, добавляете 1 и добавляете два числа вместе снова? –

+0

@Dair: вопрос 0 - (-1) –

0

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

0

Моя интуиция говорит мне, что 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

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

Вы можете сделать это с карандашом и бумажным стилем, где вы берете с номера рядом с ним, но он чувствует себя немного тупой по сравнению с десятичными числами. С десятичными числами говорят, что 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 0 0 0, вычесть столбцы, и вы получите 0 0 0 0 0 0 0 1.