Modulo durch logisches Verunden
-
Hallo,
warum ist das Ergebnis der bitweisen Verundung einer Zahl a mit 31 das gleiche wie
a = a % 32?
In assembler sähe das so aus: andl $0x1f, %eax
danke
-
Weil beim Ver-Unden nur die Bits durchkommen, die bei der Darstellung von der Zahl 31 auf 1 sind (die ersten 5 kleinsten Bits).
Beim Modulieren ist der Wertebereich so gross wie der Modulant (nennt man den so oO).
x % m = y, wobei 0 <= y < m
-
Sei (x y) Binärdarstellung von a, wobei y die hinteren 5 Bits und x die restlichen Bits sind. Dann ist a = 32x + y. Es gilt a & 31 = y, weil nur die 5 hinteren Bits von a stehen bleiben. Es gilt aber auch a % 32 = (32x + y) % 32 = (32x % 32) + (y % 32) = 0 + y, weil 32x durch 32 teilbar ist.
Edit: Das klappt natürlich auch mit jeder anderen Zweierpotenz, aber mit keiner Zahl, die keine Zweierpotenz ist.