Überprüfen Sie, ob eine vorzeichenlose Binärzahl durch 15 teilbar ist


7

Ich bin ein Informatikstudent und habe mich stundenlang mit dieser Frage beschäftigt.

Wir haben eine binäre vorzeichenlose Zahl X, dargestellt durch 12 Bits. Wir möchten ein System mit 1-Bit-Ausgabe bauen - Y, das ist '1', wenn X ohne Rest durch 15 geteilt wird.

Die einzigen Komponenten, die wir verwenden können, sind:

  • 4-Bit-Addierer mit C0 (Übertrag) als Eingang und C4 als Ausgang.
  • 1 einzelnes NOR-Gatter mit 3 Eingängen.

Geben Sie hier die Bildbeschreibung ein

Ich habe ein Muster gefunden. Wenn ich 2 ^ i% 15 für 0 <= i <= 11 berechne (da es 12 Bits sind), dann bekomme ich für eine Sequenz 1248 1248 1248.

Und wenn ich 0001 1110 1111 habe, kann ich einfach alle Ziffern multiplizieren, summieren und prüfen, ob meine Nummer durch 15 teilbar ist.

0 + 0 + 0 + 8 + 1 + 2 + 4 + 0 + 1 + 2 + 4 + 8 = 30

Das Problem ist, ich habe keine Ahnung, wie ich es implementieren soll und ob es überhaupt effizient ist.

Ich würde gerne Hilfe bekommen.


Können Sie nur einen einzelnen 4-Bit-Addierer und ein einzelnes NOR-Gatter verwenden? Oder können Sie mehrere Addierer / NOR-Gatter verwenden?
Marcelm

Siehe StackOverflow .
Egal

Antworten:


19

Wissen Sie, wie Sie die Teilbarkeit durch 9 in Basis 10 überprüfen können?

Addieren Sie alle Ziffern mit der Basis-10-Arithmetik. Wenn das Ergebnis mehrstellig ist, wiederholen Sie den Vorgang. Stoppen Sie, wenn Sie eine Ziffer haben. Wenn die Ziffer 9 ist, war die ursprüngliche Zahl durch 9 teilbar. Dies funktioniert, weil der zu testende Teiler Basis 1 ist. Zum Beispiel ist 45 durch 9 teilbar und die Ziffern summieren sich zu 9, für zwei Ziffern wird nur ein Addierer benötigt. 999 ist auch, zwei Addierer werden für die drei Ziffern benötigt.

Haben Sie jetzt einen Hinweis, wie Sie die Teilbarkeit durch 15 prüfen können, wenn Sie über Rechenfunktionen der Basis 16 verfügen?


Ja. Ich verstehe warum, aber wie kann ich den "Stopp, wenn Sie eine Ziffer haben" implementieren?
Sheldonzy

2
@sheldonzy, Sie beginnen nur mit 3 hexadezimalen Ziffern, sodass Sie nicht mehr als 2 Ergänzungen benötigen. ... Und das Hinzufügen von 0 ist dasselbe wie das Nicht-Hinzufügen der zweiten Addition.
Das Photon

Ich habe eine vollständige Antwort mit einer Zeichnung hinzugefügt, basierend auf Ihrer Antwort. Danke :)
Sheldonzy

4

Die Technik ähnelt der, mit der Sie prüfen würden, ob eine Zahl durch 9 in Dezimalzahl teilbar ist. Wir müssen die Zahl in vier Bit-Ziffern aufteilen und dann die Ziffern wiederholt addieren, bis wir eine einzige Ziffer übrig haben.

Nennen wir die Ziffern XYZ

c1,r1 = X + Y
c2,r2 = Z + r1 + c1
c3,r3 = r2 + 1

WENN X, Y, Z durch 15 teilbar ist, dann ist c2, r2 auch durch 15 teilbar. Außerdem ist c2, r2 kleiner als 0x1e. Wenn also r = 15 ist, war die ursprüngliche Zahl durch 15 teilbar. Wir testen, ob r gleich 15 ist, indem wir eins hinzufügen und das resultierende Übertragsflag betrachten.

Was mich verwundert, ist, wofür das Nor-Tor sein soll.


Ihre Methode schlägt für die Eingaben fehl 0FF, 1EF, 2DF, 3CF, 4BF, 5AF, 69F, 78F, 87F, 96F, A5F, B4F, C3F, D2F, E1F, F0F, FFF. Ihre dritte Zeile muss lesenc3,r3 = r2 + c2 + 1
Nick Gammon

0

Die vollständige Antwort:

Wie @Neil_UK sagte, habe ich 12 Bits, und wenn ich überprüfen möchte, ob diese Zahl durch 15 teilbar ist, nehme ich die 12 Bits und betrachte sie als 3 Zahlen in Basis 16.

Ich addiere die drei Zahlen zusammen und füge den Übertrag immer zum nächsten Addierer hinzu.

Nachdem ich sie alle hinzugefügt habe, erhalte ich als Ergebnis eine Nummer. Wie gesagt, wir wollen sehen, ob die Zahl durch 15 teilbar ist und weil sich die Zahlen in der Basis 16 befinden. Wenn das Ergebnis also 15 ist, ist die Zahl durch 15 teilbar.

Wenn diese Zahl 15 ist, in binär 1111, also wenn ich hinzufügen , werden 1zu 1111, werde ich bekommen carry 1und 0000.

Wenn diese Zahl 0, binär 0000, also wenn ich hinzufügen , werden 1zu 0000, werde ich bekommen 0001.

Hier kommt der NOR ins Spiel.

Die Zahl ist durch 15 teilbar, wenn die letzten 3 Ziffern 0 sind.

Die Rennbahn:

Geben Sie hier die Bildbeschreibung ein

Zum Beispiel:

1111 1111 1111::

  • 1111+ 1111+ 1= tragen 1und1111
  • 1111 + 1111+ tragen 1= tragen 1und1111
  • 1111+ tragen 1= tragen 1und0000
  • NOR (0,0,0) = True

0001 1001 0101: (405):

  • 0101+ 1001+ 1=1111
  • 1111+ 0001= tragen 1und0000
  • 0000+ tragen 1=0001
  • NOR (0,0,0) = True
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.