Thread ~- anstatt -- (10 answers)
Opened by leo11 at 2009-11-30 16:30

murphy
 2009-11-30 17:53
#128774 #128774
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Am besten kann man sich das in der Binärdarstellung überlegen.

Integerarithmetik im Computer ist effektiv meist Moduloarithmetik in einem Körper Z / (2^n Z), wobei n die Anzahl der Bits in den Registern ist. Anschaulich heißt das, dass eigentlich nur mit nicht negativen ganzen Zahlen gerechnet wird, da man aber nur endlich viele Zahlen darstellen kann und sie praktisch zyklisch anordnet, kann man einfach die größere Hälfte der verfügbaren positiven Zahlen mit negativen Zahlen identifizieren und die Ergebnisse von Rechenoperationen stimmen weiterhin: Bei 8 Bit Zahlen wird 6 - 5 = 6 + (-5) zum Beispiel effektiv als (6 + (2^8 - 5)) % 2^8 = (6 + 251) % 256 = 257 % 256 = 1 berechnet.

Es wird also -x dargestellt durch 2^n - x = (2^n - 1) - (x - 1). Nun ist aber 2^n - 1 gerade die Zahl, deren Binärdarstellung genau aus n mal der Ziffer 1 besteht. Zieht man von dieser Zahl etwas ab, so werden im Ergebnis genau die Bits zu 0, die in der abgezogenen Zahl 1 waren, alle anderen bleiben auf 1 stehen. Daher ist (2^n - 1) - (x - 1) = ~(x - 1).

Es folgt also ~(-x) = ~(~(x - 1)) = x - 1.
When C++ is your hammer, every problem looks like your thumb.

View full thread ~- anstatt --