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
Das einzige was machbar ist, ist durch 1024 zu Teilen, und dann mit 10 multiplizieren. Von wieviel Bytes sprechen wir eigentlich?? julian
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
Geht mit einem Schieberegister allein nicht. Am einfachsten ist es, wenn man mit BCD arbeitet, da sieht man es sofort. MFG Falk
>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.
ich brauch nur das ergebnis ob die zahl teilbar durch 100 ist oder nicht
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.
also kurz und knapp: bool ergebnis:(x %100==0) D.h. du brauchst ganz andere Mathematik als Division
Uahh, Du outest Dich gerade. Das macht meine 8 jährige Tochter allein, ohne Controller .... Bleibt da was übrig ist die Frage...
Klatsch schrieb: > Das macht meine 8 jährige Tochter allein, ohne Controller .... Wieviele ns braucht sie denn dafür?
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!
wenige ms wird die brauchen aber zeit ist ja nicht kritisch wie man oben lesen kann
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
Hier mal etwas Produktives: http://www.mikrocontroller.net/attachment/302/Teilen-binaer.PDF Eine Anleitung wie man sich einen Algo schreibt in ASM zum teilen von ganzzahligen, vorzeichenlosen Zahlen. julian
1 | if (x AND 3) != 0 |
2 | print "nicht teilbar durch 100" |
3 | exit |
4 | |
5 | x = x / 4 |
6 | |
7 | # x ist jetzt < 250 |
8 | |
9 | if x >= 125 |
10 | x = x - 125 |
11 | |
12 | # x ist jetzt < 125 |
13 | |
14 | if x >= 75 |
15 | x = x - 75 |
16 | |
17 | # x ist jetzt < 75 |
18 | |
19 | if x==0 OR x==25 OR x==50 |
20 | print "teilbar durch 100" |
21 | else |
22 | print "nicht teilbar durch 100" |
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
Jobst M. schrieb: > Johann L. schrieb: >> # x ist jetzt < 250 > > Nö! ... Wieso? Die ursprüngliche Zahl ist 0 ≤ x < 1000 und damit 0 ≤ x/4 < 250.
einfach nur High oder Lowpegel wäre super Im Augenblick liegt sie auf 13 Leitungen
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
Wie entsteht diese Zahl? Steht die einfach so magisch im Raum, oder kommt die irgendwo raus und man kann evtl in den Entstehungsprozess eingreifen?
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.
>Rein in klassischer Logik, wenn man Zeit hat:
Und wenn man keine Zeit hat, eine LookUp Tabelle in einem Speicher.
@ Markus Welche Hardware steht dir zur Vefügung, um das Problem zu lösen?
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
Achso ich meine nicht jede Person in diesem Thread aber dafür viele viele Personen in anderen Threads.
A. K. schrieb: > Dass es mit Schieberegister nicht geht wurde bereits geklärt. Das wurde behauptet - nicht bewiesen.
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
Hallo Detlef! Gibts dazu irgendwie eine Theorie? Würde mir das gerne mal genauer ansehen.
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
hast du jetzt nicht einfach eine Division von Hand durchgeführt, das muss man kann man doch auch im Binärsystem machen ...
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
Danke Jobst! Also hatte ich intuitiv recht, wußte nur nicht bei kurzem Betrachten wie man es genau macht.
Das riecht doch nach BCD Arithmetik: AVR204: BCD Arithmetics http://www.atmel.com/atmel/acrobat/doc0938.pdf
1 | Algorithm Description “bin2BCD16” implements the following algorithm: |
2 | 1. Load Loop counter with 16. |
3 | 2. Clear all three bytes of result. |
4 | 3. Shift left input value Low byte. |
5 | 4. Shift left carry into input value High byte. |
6 | 5. Shift left carry into result byte 0 (two least significant digits). |
7 | 6. Shift left carry into result byte 1. |
8 | 7. Shift left carry into result byte 2 (most significant digit). |
9 | 8. Decrement Loop counter |
10 | 9. If Loop counter is zero, return from subroutine. |
11 | 10. Add $03 to result byte 2. |
12 | 11. If bit 3 is zero after addition, restore old value of byte 2. |
13 | 12. Add $30 to result byte 2. |
14 | 13. If bit 7 is zero after addition, restore old value of byte 2. |
15 | 14. Add $03 to result byte 1. |
16 | 15. If bit 3 is zero after addition, restore old value of byte 1. |
17 | 16. Add $30 to result byte 1. |
18 | 17. If bit 7 is zero after addition, restore old value of byte 1. |
19 | 18. Add $03 to result byte 0. |
20 | 19. If bit 3 is zero after addition, restore old value of byte 0. |
21 | 20. Add $30 to result byte 0. |
22 | 21. If bit 7 is zero after addition, restore old value of byte 0. |
23 | 22. Goto Step 3. |
24 | In the implementation. Steps 10 - 21 are carried out inside a loop, where the Z-pointer is |
25 | used for successive access of all three bytes of the result |
Da kann man noch ein wenig optimieren - man braucht ja nur 13 Bits ...
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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.