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.


Anmelden zum Antworten