Hallo,
ich möchte eine Zahl die mir binär vorliegt in Schieberegister oder
ähnlichem durch 100 teilen, mir gehts dabei nur, ob es genau aufgeht
oder ob eine kommazahl rauskommt, wenn eine Kommazahl rauskommt isses
egal, wie groß diese ist.
binär durch 4 Teilen müsste doch per Schieberegister funktionieren?
aber wie durch 100 ?
lg Markus
Wenn es nicht unbedingt ein Schieberegister sein muss, kann man das auch
in einer Schleife machen, ist genauer, dauert aber auch viel länger.
Kannst dich also entscheiden, zwischen Schnelligkeit und Genauigkeit!
julian
>binär durch 4 Teilen müsste doch per Schieberegister funktionieren?
Ja.
>aber wie durch 100 ?
Gar nicht. Schieberegister teilen nur durch Zweierpotenzen.
Jeder Schiebebefehl teilt durch 2.
kannst du denn kostengünstig multiplizieren?
wie groß ist dein register und dein Wertebereich?
durch multioplikation und anschließende Division durch 2er Potenzen kann
man auch andere Faktoren annähern.
x * 3/32
x * 6/64
x * 7/64
x * 12/128
x * 13/128
...
Wenn es nur ungefähr sein muss, dann kannst du auch eine Näherung
nehmen.
Dividiere dazu durch 128 durch 7-maliges schieben.
Merke dir das Ergebnis.
Schiebe noch 2 mal (Division durch 512) und addiere beide Ergebnisse.
Das Gesamtergebnis ist nur knapp 2,5% zu klein.
W.
Wenn du genug Rechenzeit hast dann addiere die Zahl 100 mehrfach und
prüfe, od sie irgendwann mit deiner Zahl überein stimmt.
Oder subtrahiere mehrfach 100 von deiner Zahl und wenn nach 100
Schritten kein Ergebnis 0 war, dann ist deine Zahl nicht teilbar.
Klatsch schrieb:
> Das macht meine 8 jährige Tochter allein, ohne Controller ....
Wieviele ns braucht sie denn dafür?
Bis man den Code schreibt ist die sicher fertig!
Markus schrieb:> ich brauch nur das ergebnis ob die zahl teilbar durch 100 ist oder nicht
Jede Zahl ist durch 100 teilbar....
Mit Rest 0 allerdings nur, wenn die 1er und 10er Stelle =0 ist.
Grüße Micha
Markus schrieb:> ich möchte eine Zahl die mir binär vorliegt in Schieberegister oder> ähnlichem durch 100 teilen
Wie liegt die Zahl denn vor?
Hast Du 13 Leitungen ... oder wie?
Und in welcher Form wünschst Du Dir die Ausgabe?
Einfach nur H/L-Pegel?
Gruß
Jobst
Johann L. schrieb:> Wieso? Die ursprüngliche Zahl ist 0 ≤ x < 1000 und damit 0 ≤ x/4 < 250
Nö! :-)
Markus schrieb:> Zahlem von 0 bis 9999, also 13 Bit
Gruß
Jobst
Hi
Vorschläge gibt's viele, aber so wie ich die Frage verstehe liegt die
Zahl binär vor und du mußt ohne µC herausfinden, ob sie durch 100
Teilbar ist. Die Antwort gibt's bereits, aber ich wiederhol sie gern:
Mit Schieberegister wird's nix.
Das ist schon ein wenig aufwändiger....
Gruß oldmax
Rein in klassischer Logik, wenn man Zeit hat:
- Binärzähler 13 Bit,
- Komparator 13 Bit,
- BCD-Zähler 8 Bit mit Nullerkennung.
Vielleicht hilft auch Herr Zuse. Der musst das damals mit geringstem
Aufwand machen.
Total geil dieses Forum ;)
Es geht immer los mit einer unpräzisen Frage und dann kommen die
lustigsten Antworten bei den nicht nachgedacht oder die Frage nicht
gelesen wurde.
Martin schrieb:> Es geht immer los mit einer unpräzisen Frage und dann kommen die> lustigsten Antworten bei den nicht nachgedacht oder die Frage nicht> gelesen wurde.
Inwiefern? Dass es mit Schieberegister nicht geht wurde bereits geklärt.
Was stört dich daran, dass andere Lösungsansätze vorgeschlagen werden?
Es wurde von Markus überhaup nicht erwehnt, ob er überhaut irgendetwas
programmierbaren zur Verfügung hat.
Wenn es C sein darf, kennt jemand diese Rechenoperation "x % 100"?
>Das einzige was machbar ist, ist durch 1024 zu Teilen, und dann mit>10 multiplizieren.
Super Antwort
999 / 1024 = 0
0 * 10 = 0
und
1 / 1024 = 0
0 * 10 = 0
Hans schrieb:>> Dass es mit Schieberegister nicht geht wurde bereits geklärt.>> Das wurde behauptet - nicht bewiesen.
Eigentlich schon. Wenn es sich nur um ein normales Schieberegister
handelt, ohne nennenswerte Zusatzschaltung, dann läuft es auf die Frage
hinaus, ob sich durch fortgesetztes Teilen durch 2 irgendwann ein Teiler
100(dez) ergibt. Und das ist nicht der Fall.
Wenn das Schieberegister Teil einer komplexen Schaltung sein darf, dann
kann es jedoch vielleicht zur Lösung beitragen.
A. K. schrieb:> Eigentlich schon. Wenn es sich nur um ein normales Schieberegister> handelt, ohne nennenswerte Zusatzschaltung, dann läuft es auf die Frage> hinaus, ob sich durch fortgesetztes Teilen durch 2 irgendwann ein Teiler> 100(dez) ergibt. Und das ist nicht der Fall.>> Wenn das Schieberegister Teil einer komplexen Schaltung sein darf, dann> kann es jedoch vielleicht zur Lösung beitragen.
Da ich an rückgekoppelte Schiebergister denke, könnte es eine "Lösung"
geben. Dem Threadstarter geht es um das Erkennen einer Zahl die - ohne
Rest - durch 100 teilbar ist. Daher auch meine Frage nach der
verfügbaren Hardware.
Hans schrieb:> Da ich an rückgekoppelte Schiebergister denke, könnte es eine "Lösung"> geben.
Sowas in der Art: Eine Rückkopplung finden, die beim Weitertakten nur
bei durch 100 ohne Rest teilbaren Werten irgendwann auf z.B. 0 kommt?
Hätte bisschen was von Turing: Wenn das Ding irgendann bei 0
stehenbleibt passt es, wenn es ewig weiterläuft dann nicht. ;-)
Abdul K. schrieb:> Schnödes EPROM ?
Hatten wir schon. Reiht sich ein in die zu programmenden Lösungen. Nur
dass Controller mit weniger Aufwand programmiert werden als EPROMs.
A. K. schrieb:> Sowas in der Art: Eine Rückkopplung finden, die beim Weitertakten nur> bei durch 100 ohne Rest teilbaren Werten irgendwann auf z.B. 0 kommt?> Hätte bisschen was von Turing: Wenn das Ding irgendann bei 0> stehenbleibt passt es, wenn es ewig weiterläuft dann nicht. ;-)
Wir definieren zwei Endzustände (DEA), der eine wird erreicht, wenn die
Zahl - ohne Rest - durch 100 teilbar ist, der andere, wenn sie nicht
teilbar ist.
Die ungeraden Zahlen können leicht eliminiert werden.
A. K. schrieb:> Abdul K. schrieb:>>> Schnödes EPROM ?>> Hatten wir schon. Reiht sich ein in die zu programmenden Lösungen. Nur> dass Controller mit weniger Aufwand programmiert werden als EPROMs.
Mußte ja kommen. Wie im Kindergarten.
Da wir gerade dort sind: Ich behaupte einfach mal, es geht mit einem
Schieberegister und etwas Rückkopplungslogik.
Die Primzahl - Königin der Zahlen.
>>Das einzige was machbar ist, ist durch 1024 zu Teilen, und dann mit>>10 multiplizieren.>Super Antwort>999 / 1024 = 0>0 * 10 = 0>und>1 / 1024 = 0>0 * 10 = 0
Ja und? Die Zahlen 999 und 1 sind nicht durch 100 teilbar. Somit ist das
Ergebnis 0 = FALSE richtig (oder sollte ich statt richtig lieber TRUE
schreiben ;-)
ERGO: Der Lösungsweg klappt.........
Matthias Lipinsky schrieb:> Ja und? Die Zahlen 999 und 1 sind nicht durch 100 teilbar. Somit ist das> Ergebnis 0 = FALSE richtig (oder sollte ich statt richtig lieber TRUE> schreiben ;-)>> ERGO: Der Lösungsweg klappt.........
Dann rechne mal das mit jedem belibigen wert zwischen 1023 und 0 aus.
Richtig es kommt IMMER Null raus.
500 / 1024 = 0
0 * 10 = 0
...nur mal so spontan als (unausgereifte?) Idee... (Bitnummerierung
startet mit 0):
1. Wenn Registerwert=0 dann Abbruch (nicht teilbar), sonst weiter mit
Punkt 2
2. Wenn Bit 12 gesetzt, dann (Bit löschen, 96 addieren, Sprung nach
Punkt 2)
3. Wenn Bit 11 gesetzt, dann (Bit löschen, 48 addieren, Sprung nach
Punkt 3)
4. Wenn Bit 10 gesetzt, dann (Bit löschen, 24 addieren, Sprung nach
Punkt 4)
5. Wenn Bit 9 gesetzt, dann (Bit löschen, 12 addieren, Sprung nach Punkt
5)
6. Wenn Bit 8 gesetzt, dann (Bit löschen, 56 addieren, Sprung nach Punkt
6)
7. Wenn Bit 7 gesetzt, dann (Bit löschen, 28 addieren, Sprung nach Punkt
7)
8. Wenn der verbleibende Registerwert=0 oder Registerwert=100, dann
durch 100 teilbar, sonst nicht
Hallo,
ich würde dafür einen EPROM (trotz "dislike" von manchen hier) benützen,
wo die binäre Zahl für die Adressierung verwende. Auf die 100., 200.,
300., (usw) Stelle einen "1" programmieren, so wird der Q0 Ausgang
direkt zeigen ob die Zahl mit 100 teilbar ist.
erstens: Der OP spricht von den Zahlen 0 bis 9999, die er untersuchen
will. Dazu braucht man 14 Strippen und nicht 13, wie behauptet.
zweitens: Wenn die Zahl durch 100 teilbar sein soll, muß sie auch glatt
durch 4 teilbar sein., d.h. die unteren beiden Bits müssen 0 sein.
Damit ist die Frage darauf reduziert, ob die Zahl durch 25 teilbar ist.
Wenn ja, dann ist sie also zweimal glatt durch 5 teilbar.
Wie man diese Eigenschaft ohne Teilen/Subtrahieren im Binärsystem
feststellen kann entzieht sich allerdings leider meiner mathematischen
Kenntnis, schade.
Cheers
Detlef
Detlef _a schrieb:> erstens: Der OP spricht von den Zahlen 0 bis 9999, die er untersuchen>> will. Dazu braucht man 14 Strippen und nicht 13, wie behauptet.
...hatte ich auch erst gedacht. Er hat aber gesagt, dass er eine
Binärzahl auf 13 Eingangsleitungen liegen hat. Also auch 13 Bit. Die
"9999" ist hier verwirrend, weil zu hoch.
Wen auch immer das interessieren mag:
Teilbarkeit durch 5 einer Binärzahl läßt sich mit Darstellung der Zahl
zur Basis 4 und alternierenden Quersummen feststellen.
Beispiel:
3685_basis_10 = E65_basis_16 = 321211_Basis_4
3-2+1-2+1-1=0 ist durch 5 teilbar ohne Rest, also ist es 3685 auch.
Hilft dem Originalposter auch nicht weiter.
math rulez!
Cheers
Detlef
Markus schrieb:> Zahlem von 0 bis 9999, also 13 Bit
Soso....
Passt in deine Bits ein wenig mehr rein?
Ich komme da mit 2^13 gerade mal auf 8192.
Jobst M. schrieb im Beitrag #2356495:
> 40 mit Basis 4 ist 220 -> 2+2-0 = 4 = nicht durch 5 teilbar.
2-2+0 vielleicht... ;-)
Wenn man es falsch macht, hat man arge Zweifel ...
Solange die Rechnung mit '-' anfängt, funktioniert's ...
Ist auch einigermassen logisch, da 11 (Basis4) 5 sind. Zieht man die
voneinander ab, ist es 0. Überlauf funktioniert auch, da 4+1 sowieso 5
sind ... (z.B. 1160 (dezimal))
Gruß
Jobst
Detlef _a schrieb:> Hilft dem Originalposter auch nicht weiter.
Uuuuuuiiii!!! 8-)
Evtl. doch!
Er möchte wissen, ob die Zahl durch 100 teilbar ist.
Dazu schiebt er sie 2x nach rechts (also :4) - dann sollte die Zahl
durch 25 teilbar sein. Allerdings sollten die beiden rausgeschobenen
Bits 0 sein. Wenn sie durch 25 teilbar ist, ist sie auch durch 5
teilbar.
Also dies mit der oben gezeigten Methode überprüfen.
Ist das so, dann kann man die Zahl ja relativ einfach mit einer Methode
durch 5 teilen, die mir gerade aufgegangen ist:
Bleiben wir bei:
Detlef _a schrieb:> 321211_Basis_4
Die letzte Stelle ziehe ich nun bei dieser und bei der nächst höheren
ab.
Ausserdem notiere ich diesen Wert als Ergebnis.
Abziehen 11. Ergebnis 1.
321211 - 11 = 321200
Das teile ich durch 4
321200 / 4 = 32120
Nun wieder abziehen:
Abziehen 00, Ergebnis 01.
32120 - 00 = 32120
32120 / 4 = 3212
Abziehen 22, Ergebnis 201
3212 - 22 = 3130
3130 / 4 = 313
Abziehen 33, Ergebnis 3201
313 - 33 = 110
110 / 4 = 11
Abziehen 11, Ergebnis 13201 (= 737 dec (=3685 / 5))
Rest 0
Nun kann man nochmal nach 'durch 5 teilbar' gucken ...
;-)
Gruß
Jobst
Es ist aber nicht einfach binär geteilt! Es werden immer 2 bzw. 4 Bit
gleichzeitig verarbeitet!
Die 12-Bit-Zahl oben habe ich in 5 Schritten geteilt!
Gruß
Jobst
bleibt die Frage ob das auf dem controller schneller geht,
ich kann z.B. von Hand auch im Hex-Format schnell dividieren:
E65 : 64 (also 3685/100)
1) c8 subtrahieren (1.Stelle also 2)
bleibt 1E5
2) 190 subtrahieren (2. Stelle also 4)
bleibt 55 als Rest, also nicht durch 100 teilbar
obwohl ich jetzt nur 2 Subtraktionen hatte will ich nicht behaupten dass
das Verfahren auf dem Controller schneller ist als eine binäre Division
Walter schrieb:> obwohl ich jetzt nur 2 Subtraktionen hatte
Nein, hattest Du nicht.
0xE65 - 0xC8 - 0x190 = 0xC0D
Mindestens eine der Rechnungen hast Du mehrfach gemacht.
Ausserdem mußt Du auch noch die Möglichkeit haben (und die Entscheidung
dafür treffen) ob 0x64 abgezogen werden sollen, um die Information zu
erhalten, ob die Zahl durch 100 teilbar ist.
Darum ging es mir aber nur nebensächlich. Ich habe hier eine Variante
vorgestellt, mit der man einfach durch 5 teilen kann.
Sowas kann man häufiger mal gebrauchen, wenn man mit ASM auf einem uC
ohne Divisionseinheit unterwegs ist.
Gruß
Jobst
Freiberufler schrieb:> Das riecht doch nach BCD Arithmetik
Irgendwie kann ich da keine Gemeinsamkeiten entdecken.
Ich habe den Eindruck, daß kaum einer versteht, was ich da gemacht habe.
:-/
Gruß
Jobst
Vielleicht hat dein Schema einen offiziellen Namen?? Umgedrehtes
Horner-Schema würd es ganz gut treffen, oder? Naja, irgendwas mit
Restklassen noch dazu.
Warten wir mal auf die Mathematiker.
Jobst M. schrieb:>> obwohl ich jetzt nur 2 Subtraktionen hatte>> Nein, hattest Du nicht.
hatte ich doch
>> 0xE65 - 0xC8 - 0x190 = 0xC0D>> Mindestens eine der Rechnungen hast Du mehrfach gemacht.
das ganze ist natürlich nach dem üblichen Divisionsschema zu rechnen:
E65 : 64 = 24
C8
-----
1E5
190
----
55 Rest
> Ausserdem mußt Du auch noch die Möglichkeit haben (und die Entscheidung> dafür treffen) ob 0x64 abgezogen werden sollen, um die Information zu> erhalten, ob die Zahl durch 100 teilbar ist.
du musst aber genauso auch jedes Mal entscheiden ob du 0, 11 22 oder 33
abziehst,
brauchst also neben der Subtraktion einige Befehle pro Durchlauf
(1 Subtraktion, 3 Vergleiche, 1x 2fach shift)
Ich behaupte jetzt Mal ohne es nachgeprüft zu haben, das das nicht
schneller ist als die normale Division bei der du zwar 13 Durchläufe
hast, ein Durchlauf dafür aber entsprechend schnell ist
(1 Subtraktion, 1 Vergleich, 1fach shift)
Hallo Detlev,
wenn ich das richtig verstanden habe will der OP die 12/13 bit ja binär
auswerten, nicht über uc/ROM/... .Der vorgeschlagene Algorithmus könnte
doch ans Ziel führen:
a) Erst werden die untersten zwei bit (bit0 und bit1) auf =0base4
geprüft, damit ist die Teilbarkeit durch vier schonmal erledigt (das
sind einige wenige Gatter)
b) Als nächstes müsste dann der Addieralgorithmus implementiert werden.
Das sollte mit enstprechenden Volladdierern und der Addition der
entsprechneden Bitstellen auch machbar sein. Wir reden davon, dass ich
bit2/3 mit bit bit6/7 und bit10/11 addiere, bit 4/5 und 8/9 und 12/13
davon subtrahiere.
Ich habs jetzt nicht gleich asuprobiert aber so ein Volladdierer mit
jeweils 2 bit (oder in diesem Fall ein paar mehr) sollte in einigen
wenigen Gattern machbar sein.
rgds fj
Walter schrieb:> das ganze ist natürlich nach dem üblichen Divisionsschema zu rechnen:
Ach so. Okay, Du solltest Dich davon lösen, wenn Du mein Prinzip
verstehen möchtest.
Walter schrieb:> du musst aber genauso auch jedes Mal entscheiden ob du 0, 11 22 oder 33> abziehst,
Nein. Die unteren 2 Bit werden einfach kopiert und abgezogen. Keine
Entscheidung, einfach machen!
Gruß
Jobst