Kürzlich war ich verwirrt über den Modulo-Operator %
.
Es ist bekannt, dass a % b == a-a/b*b
, wenn wir integers a
und b
wo a > b
haben, und wir können diese Berechnung manuell durchführen, wenn a
und b
klein genug sind.
Wenn es jedoch darum geht, wie ein Prozessor es berechnet, verwendet der Prozessor die gleiche Methode wie zuvor erwähnt, a-a/b*b
? Vielleicht nur, indem man die Aufteilung in Subtraktion oder Addition umsetzt, oder ist da vielleicht etwas verschoben?
Außer für Potenzen von 2, wo der Modulo-Operator (und in den meisten Optimierern von Compilern) in eine einfache bitweise Operation umgewandelt werden kann, fürchte ich, der einzige Weg, es zu tun, ist der harte Weg. Erklärung ist Ссылка
In einer anderen Antwort weist @Henk Holterman darauf hin, dass einige CPUs dies im Mikrocode tun und den Rest in einem Register lassen, während sie eine Ganzzahl teilen, was bedeutet, dass der Modulo-Befehl auf eine Ganzzahl geteilt werden kann und den Rest zurückgibt. (Ich füge diese Informationen hier hinzu, weil diese Antwort bereits akzeptiert wurde.)
Es verwendet die idiv Assemblierungsanweisung:
%Vor% idiv speichert den Rest in einem Register.
Ссылка
Tags und Links language-agnostic modulo