Ich habe Probleme mit Assemblerprogrammierung und bin gespannt, wie ich feststellen konnte, ob eine Zahl ein Vielfaches von 4 ist, indem ich den logischen Operator AND verwende?
Ich weiß, wie man es mit "div" - oder "rest" -Anweisungen macht, aber ich versuche das mit Bit-Manipulation von Zahl / Wort zu machen.
Kann mir jemand in die richtige Richtung zeigen? Ich benutze MIPs, aber eine sprachunabhängige Antwort ist in Ordnung.
Nun, um zu erkennen, ob eine Zahl ein Vielfaches von einer anderen ist, müssen Sie einfach x MOD y
tun. Wenn das Ergebnis 0
ist, dann ist es ein gerades Vielfaches.
Es stimmt auch, dass für jedes y
, das eine Potenz von 2
ist, (x MOD y)
äquivalent zu (x AND (y - 1))
ist.
Daher:
%Vor%BEARBEITEN:
ok, du möchtest wissen warum (x MOD y) == (x AND (y - 1))
, wenn y
eine Potenz von 2 ist. Ich werde mein Bestes geben, um das zu erklären.
Wenn eine Zahl eine Potenz von 2 ist, dann hat sie grundsätzlich ein einzelnes Bit gesetzt (da binär die Basis 2 ist). Dies bedeutet, dass alle unteren Bits nicht gesetzt sind. Zum Beispiel: 16 == 10000b, 8 == 1000b
, etc.
Wenn Sie 1 von einem dieser Werte subtrahieren. Am Ende wird das Bit gesetzt, das nicht gesetzt wurde und alle Bits darunter gesetzt sind.
15 = 01111b, 7 = 0111b
, usw. Im Grunde wird eine Maske erstellt, mit der getestet werden kann, ob eines der unteren Bits gesetzt wurde. Ich hoffe, das war klar.
BEARBEITEN: Bastien Léonards Kommentar deckt das auch gut ab:
wenn du (unsigned) durch 4 dividierst, du Verschiebe zwei Bits nach rechts. Und so kam es dass der Rest sind diese zwei Bits, die bekommen verloren, wenn du teilst. 4 - 1 = 11b, Das heißt, eine Maske, die die beiden ergibt rechteste Bits, wenn Sie es mit einem UND Wert.
BEARBEITEN: sehen Sie diese Seite für möglicherweise klarere Erklärungen: Ссылка .
Es deckt die Erkennung von Potenzen von 2 ab und verwendet AND als schnelle Modulo-Operation, wenn es eine Potenz von 2 ist.
Eine Zahl ist ein Vielfaches von 4, wenn ihre unteren 2 Bits 0 sind. Sie können also die Zahl einfach zweimal nach rechts verschieben und die verschobenen Bits auf 0 prüfen.
Tags und Links assembly bit-manipulation