вычитание двух значений неизвестного размера - PullRequest
0 голосов
/ 26 июня 2011

Я пытаюсь вычесть два значения друг от друга, используя комплимент двойки. У меня проблема с битом переполнения. Поскольку мой контейнер содержит целое число неограниченного размера, я не знаю, является ли верхний бит результата результатом или просто переполнением. Как бы я избавился от переполнения, не используя - (я не могу просто сделать 1 << bits - 1, так как это потребовало бы использования контейнера, у которого еще нет работающего operator-)

0b1111011111 - 0b111010000 -> 0b1111011111 + 0b000110000 -> 1000001111

против (обычно)

0b00000101 - 0b000000001 -> 0b00000101 + 0b11111111 -> 0b100000100 -> 0b00000100

Ответы [ 2 ]

2 голосов
/ 26 июня 2011

Если вы вычисляете a - b, вы должны каким-то образом «упорядочить» слово - так как вы должны сделать для комплимента 2 отрицание с битовой шириной m = max (bitwidth (a), bitwidth (b)).

Чтобы избавиться от переполнения, просто сделайте mask = negate (1 << m) и примените маску с побитовым и. (Или вы можете просто проверить этот бит и обработать его соответствующим образом). </p>

0 голосов
/ 26 июня 2011

Ваша проблема в том, что вы вычитаете 9-битный 111010000 из 10-битного 1111011111. Двойное дополнение 111010000 - ...11111000110000, где точки пытаются показать, что вы должны заполнить влево столько битов 1, сколько вам нужно. Здесь вам нужно 10 битов, поэтому дополнение к 111010000 не равно 000110000, а 1000110000.

Итак, вы хотите вычислить 1111011111 + 1000110000 = 11000001111, который вы просто усекаете до 10 бит, чтобы получить правильный ответ 1000001111.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...