TL; DR
если & minus a == ~ a + 1, то ~ a == & minus; a & minus 1 и ~ ( a & minus ; 1) == & минус; ( а & минус; 1) -1 == & минус; а
Два дополняют произведения, кодируя отрицательное число a <0 по 2 ^ <em>n & minus; | a | = 2 ^ n + а . Таким образом, a + (& minus; a ) = 2 ^ n и, если игнорировать биты выше n & minus; 1, код & minus; a имеет те же математические свойства для сложения, что и & minus; a .
.
Таким образом, задача найти два дополнения b из a состоит в том, чтобы найти число b , такое как a + B = 2 ^ п * * тысяча пятьдесят-один. * * тысяча пятьдесят две
Мы можем видеть, что двоичное дополнение a , ~ a почти обладает этим свойством.
a an-1 an-2 ... a1 a0
+ ~a ~an-1 ~an-2 ... ~a1 ~a0
---------------------------------
= 1 1 ... 1 1
Либо a i = 0 и ~ a i = 1 или a i = 1 и ~ a i = 0 и а + ~ а = 111..11 = 2 ^ * 1 074 * п * * & тысяча семьдесят пять минус; 1
Добавляя один, мы можем видеть, что a + ~ a + 1 = 2 ^ n и что дополнение к двум a равно ~ а + 1.
Как ~ a + 1 = 2 ^ n & minus; a
~ а = 2 ^ N & минус; а * * -1 1 101
Если мы заменим a на ( a & minus; 1), мы получим
~ ( а & минус; 1) = 2 ^ п & минус; ( а & минус; 1) & минус; 1
= 2 ^ n & minus; a
= ~ a + 1
То есть ~ a + 1 и ~ ( a -1) идентичны.