Сложение двух чисел без использования оператора сложения

В c ~ есть оператор дополнения до 1. Это эквивалентно: ~a = -b + 1 Таким образом, a - ~b -1 = a-(-b + 1) + 1 = a + b - 1 + 1 = a + b

Кто-нибудь может мне это объяснить?


person user3464330    schedule 29.03.2014    source источник
comment
Вы сами разобрались с несколькими простыми примерами? Может быть, попробовать «сложить» пару 4-битных чисел таким образом, сделать это 3 или 4 раза, объяснить это себе?   -  person High Performance Mark    schedule 29.03.2014
comment
Использование a - -b - это еще один способ.   -  person Bathsheba    schedule 29.03.2014
comment
Это будет иметь смысл только после того, как вы поймете дополнение до двух.   -  person user3386109    schedule 29.03.2014
comment
Связанный: stackoverflow .com/questions/791328/   -  person anatolyg    schedule 29.03.2014
comment
Шаги, предпринятые этим выводом, немного странные. a - ~b -1 = a-(-b + 1) + 1 допустимо (и равно a + b), но на самом деле это не имеет смысла как шаг. Похоже, что он подставляет ~b = -b + 1 (что неверно) и как бы случайно исправляет это, заменяя вычитание в конце на сложение. Очень странно.   -  person harold    schedule 29.03.2014


Ответы (2)


Из начальной школы математики мы знаем

a = -(-a);

Из дополнения до двух мы знаем, что

-a = (~a) + 1  (invert and add one)

так что мы знаем, что

a + b 
= a - (-b)      elementary math
= a - (~b + 1)  twos complement
= a - (~b) - 1   distribute the negative (elementary math)
person old_timer    schedule 29.03.2014

Вы правы, что ~ всегда является дополнением до 1 (иначе побитовым) в c. Где вы ошибаетесь, так это в том, что C не гарантирует дополнение 2 для чисел. Таким образом, все ваши расчеты зависят от использования основной разновидности C.

person Deduplicator    schedule 29.03.2014