Teilen durch 100 per Schieberegister?

Gast #2346134
Lesenswert?

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
#2346191
Lesenswert?

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.
#2346695
Lesenswert?

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
Gast #2347040
Lesenswert?

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
#2347087
Lesenswert?

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.
Gast #2347098
Lesenswert?

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.
#2347108
Lesenswert?

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. ;-)
Gast #2347138
Lesenswert?

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.
Persönliche Seite #2347187
Lesenswert?

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.
Gast #2347266
Lesenswert?

>>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.........
Gast #2347443
Lesenswert?

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
Gast #2348173
Lesenswert?

...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
Gast #2348190
Lesenswert?

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.
#2348244
Lesenswert?

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
Gast #2348294
Lesenswert?

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.
#2356386
Lesenswert?

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
#2356510
Lesenswert?

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
#2356549
Lesenswert?

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
Gast #2356652
Lesenswert?

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
#2356670
Lesenswert?

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
Gast #2356672
Lesenswert?

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 ...
Gast #2356734
Lesenswert?

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)
Gast #2356762
Lesenswert?

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
#2356777
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren