Wie kann ich feststellen, ob eine Zahl ein Vielfaches von vier ist und nur den logischen Operator AND verwendet?

8

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.

    
Mithrax 14.04.2009, 17:47
quelle

4 Antworten

22

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.

    
Evan Teran 14.04.2009, 17:49
quelle
4

(x & amp; 3) == 0

W.r.t. Assemblersprache, verwenden Sie TST, falls verfügbar, andernfalls AND, und überprüfen Sie das Null-Flag.

    
starblue 14.04.2009 17:52
quelle
1

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.

    
Hldev Zkran 14.04.2009 17:52
quelle
1

In x86-Baugruppe:

%Vor%     
Bastien Léonard 14.04.2009 18:01
quelle

Tags und Links