Forum: Mikrocontroller und Digitale Elektronik Teilen durch 100 per Schieberegister?


von Markus (Gast)


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

von Julian R. (tuefftler)


Lesenswert?

Das einzige was machbar ist, ist durch 1024 zu Teilen, und dann mit 10 
multiplizieren. Von wieviel Bytes sprechen wir eigentlich??

julian

von Julian R. (tuefftler)


Lesenswert?

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

von Markus (Gast)


Lesenswert?

Zahlem von 0 bis 9999, also 13 Bit

von Markus (Gast)


Lesenswert?

zeit ist nicht kritisch, 100 sekunden sind kein problem

von Falk B. (falk)


Lesenswert?

Geht mit einem Schieberegister allein nicht. Am einfachsten ist es, wenn 
man mit BCD arbeitet, da sieht man es sofort.

MFG
Falk

von holger (Gast)


Lesenswert?

>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.

von Vlad T. (vlad_tepesch)


Lesenswert?

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
...

von Wolfgang S. (wsm)


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.

von Markus (Gast)


Lesenswert?

ich brauch nur das ergebnis ob die zahl teilbar durch 100 ist oder nicht

von Wolfgang S. (wsm)


Lesenswert?

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.

von raketenfred (Gast)


Lesenswert?

also kurz und knapp: bool ergebnis:(x %100==0)

D.h. du brauchst ganz andere Mathematik als Division

von Klatsch (Gast)


Lesenswert?

Uahh, Du outest Dich gerade.

Das macht meine 8 jährige Tochter allein, ohne Controller ....

Bleibt da was übrig ist die Frage...

von möp (Gast)


Lesenswert?

Klatsch schrieb:
> Das macht meine 8 jährige Tochter allein, ohne Controller ....

Wieviele ns braucht sie denn dafür?

von Julian R. (tuefftler)


Lesenswert?

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!

von raketenfred (Gast)


Lesenswert?

wenige ms wird die brauchen

aber zeit ist ja nicht kritisch wie man oben lesen kann

von Micha (Gast)


Lesenswert?

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

von Julian R. (tuefftler)


Lesenswert?

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

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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"

von Jobst M. (jobstens-de)


Lesenswert?

Johann L. schrieb:
> # x ist jetzt < 250

Nö! ...


Gruß

Jobst

von Jobst M. (jobstens-de)


Lesenswert?

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

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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.

von Markus (Gast)


Lesenswert?

einfach nur High oder Lowpegel wäre super


Im Augenblick liegt sie auf 13 Leitungen

von Jobst M. (jobstens-de)


Lesenswert?

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

von Martin V. (oldmax)


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

von (prx) A. K. (prx)


Lesenswert?

Wie entsteht diese Zahl? Steht die einfach so magisch im Raum, oder 
kommt die irgendwo raus und man kann evtl in den Entstehungsprozess 
eingreifen?

von (prx) A. K. (prx)


Lesenswert?

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.

von Martin (Gast)


Lesenswert?

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.

von Matthias L. (Gast)


Lesenswert?

>Rein in klassischer Logik, wenn man Zeit hat:

Und wenn man keine Zeit hat, eine LookUp Tabelle in einem Speicher.

von Hans (Gast)


Lesenswert?

@ Markus

Welche Hardware steht dir zur Vefügung, um das Problem zu lösen?

von (prx) A. K. (prx)


Lesenswert?

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?

von Martin (Gast)


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

von Martin (Gast)


Lesenswert?

Achso ich meine nicht jede Person in diesem Thread aber dafür viele 
viele Personen in anderen Threads.

von Hans (Gast)


Lesenswert?

A. K. schrieb:
> Dass es mit Schieberegister nicht geht wurde bereits geklärt.

Das wurde behauptet - nicht bewiesen.

von (prx) A. K. (prx)


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.

von Hans (Gast)


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.

von (prx) A. K. (prx)


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. ;-)

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

Schnödes EPROM ?

von (prx) A. K. (prx)


Lesenswert?

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.

von Hans (Gast)


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.

von Abdul K. (ehydra) Benutzerseite


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.

von Martin (Gast)


Lesenswert?

Dann wartet doch mal was Markus dazu sagt.

von Matthias L. (Gast)


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.........

von Martin (Gast)


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

von Tom (Gast)


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

von olykar (Gast)


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.

von Detlef _. (detlef_a)


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

von Tom (Gast)


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.

von Detlef _. (detlef_a)


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

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

Hallo Detlef!

Gibts dazu irgendwie eine Theorie? Würde mir das gerne mal genauer 
ansehen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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...  ;-)

von Jobst M. (jobstens-de)


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

von Jobst M. (jobstens-de)


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

von Walter (Gast)


Lesenswert?

hast du jetzt nicht einfach eine Division von Hand durchgeführt,
das muss man kann man doch auch im Binärsystem machen ...

von Jobst M. (jobstens-de)


Lesenswert?

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

von Walter (Gast)


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

von Jobst M. (jobstens-de)


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

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

Danke Jobst! Also hatte ich intuitiv recht, wußte nur nicht bei kurzem 
Betrachten wie man es genau macht.

von Freiberufler (Gast)


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 ...

von Jobst M. (jobstens-de)


Lesenswert?

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

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

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.

von Walter (Gast)


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)

von friedrich (Gast)


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

von Jobst M. (jobstens-de)


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

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
Noch kein Account? Hier anmelden.