2015-11-06 18 views
3

Как мы все знаем, как правило, отрицательные числа в памяти представляет собой, как двоичное числа комплемента, как этотОбъясните, почему х == ~ (~ х + 1) + 1 (дополнение до двух и обратно!)

from x to ~x + 1 

и получить назад мы не делаем очевидную вещь, как

~([~x + 1] - 1) 

, но вместо этого мы делаем

~[~x + 1] + 1 

может кто-то объяснить, почему он всегда работает? Я думаю, что могу доказать это с помощью 1-битного, 2-битного, 3-битного чисел, а затем использовать математическую индукцию, но это не помогает мне понять, как именно это работает.

Спасибо!

ответ

3

То же самое в любом случае. То есть, ~x + 1 == ~(x - 1). Но давайте отложим это на время.

f(x) = ~x + 1 - его собственный инверсный. Доказательство:

~(~x + 1) + 1 = 
(definition of subtraction: a - b = ~(~a + b)) 
x - 1 + 1 = 
(you know this step) 
x 

Также ~x + 1 == ~(x - 1). Зачем? Ну,

~(x - 1) = 
(definition of subtraction: a - b = ~(~a + b)) 
~(~(~x + 1)) = 
(remove double negation) 
~x + 1 

И что (немного необычно) определение вычитания, a - b = ~(~a + b)?

~(~a + b) = 
(use definition of two's complement, ~x = -x - 1) 
-(~a + b) - 1 = 
(move the 1) 
-(~a + b + 1) = 
(use definition of two's complement, ~x = -x - 1) 
-(-a + b) = 
(you know this step) 
a - b 
+0

thats безупречный. я изо всех сил старался удалить скобки. где я могу прочитать об этом определении вычитания более подробно? –

+0

@SolarDia Я не знаю, но я также добавил для этого доказательство, но, возможно, теперь он крутится круговым. – harold

+0

Спасибо, сэр, это не круговой, и он выглядит очень последовательным. определение дополнения двух -> определение вычитания -> ~ (~ x + 1) + 1 == x не уверен, что даже если это будет справедливо, но мне это нравится), этот комментарий будет получен, когда я получу достаточную репутацию. –

1

Это потому, что если вы увеличиваете ~ x (при отсутствии переполнения). Затем, преобразовывая его обратно в x, вы увеличиваете значение относительно x, но уменьшаетесь относительно x. То же самое относится и наоборот. Предполагая, что ваша переменная x имеет определенное значение, каждый раз, когда вы увеличиваете ее, относительно ~ x вы заметите, что она уменьшается.

С точки зрения программиста, это то, что вы, по сути, будете свидетелями.

Let short int x = 1   (0x0001) 
then ~x = 65534    (0xFFFE) 
~x + 1 = 65534 + 1   (0xFFFF) 
~(~x+1) = 0     (0x0000) 
~(~x+1) + 1 = 0 + 1   (0x0001)