Hallo, ich weiß mal wieder nicht so richtig weiter! Ich habe eine variable 16-Bit Zahl von der ich die Konstante 10 abziehen will. Die Zahl geht von 300 runter auf 0 und wieder hoch auf 850. Ist die Zahl größer 10 ist das kein Problem. Was mache ich aber bei einer Zahl kleiner 10? Vom Ablauf her muß ich ja erst feststellen, ob die Zahl kleiner 10 ist und ob sie links oder rechts von der 0 steht. Steht sie links kann ich die 10 einfach addieren. Steht sie aber rechts, muß ich die Zahl von 10 abziehen und den Rest links der 0 wieder dazu zählen. Das klingt sehr kompliziert. Fällt jemand eine elegante Lösung ein?
Ich würde einfach 10 abziehen und nachher feststellen ob sie zu klein war (Carry set). Wenn nicht alles ok, wenn doch wieder 10 dazu zählen um den Rest zu kennen oder was auch immer getan werden soll.
> Das klingt sehr kompliziert. In der Tat! Und das mit 'links und rechts' habe ich gleich gar nicht verstanden. > Die Zahl geht von 300 runter auf 0 und wieder hoch auf 850 Nach diesem Satz hätte ich gedacht, dass ohnehin nur 10er-Werte auftreten. Wenn nicht, wie wäre es mit generell -10, und dann auf das Carry abfragen?
S. Landolt schrieb: > Und das mit 'links und rechts' habe ich gleich gar nicht > verstanden. Das kann ich verstehen, aber mir fiel nichts besseres ein. Mit links meine ich 300 bis 0 und rechts 0 bis 850. > Wenn nicht, wie wäre es mit generell -10, und dann auf das > Carry abfragen? Das paßt ja nur rechts. Links müßte ich dann ja 20 addieren. Wenn ich rechts bin, ist das mit dem Carry als ersten Schritt sicherlich richtig, aber dann muß ich ja noch feststellen wie groß der Unterlauf ist, damit ich ihn links wieder dazu zählen kann.
Ich habe es noch immer nicht verstanden. Eine Beispielfolge mit konkreten Werten würde mir helfen.
Über eine halbe Stunde, um ein paar Zahlen niederzuschreiben? (Herr von Stumm): Stumm erfindet eine Art von Schaltern, die erst viele Stunden später schalten. Jeder drückt und dreht und schiebt verzweifelt, schimpft und flucht und schwört: "verflixter Schalter". Bis dann endlich schließen sich Kontakte, laufen Ströme durch die lange Leitung. KLEN, in memoriam Alternativ, und passend zur Fastnacht (Herr von Korf): Korf erfindet eine Art von Witzen, die erst viele Stunden später wirken. Jeder hört sie an mit Langerweile. Doch als hätt ein Zunder still geglommen, wird man nachts im Bette plötzlich munter, selig lächelnd wie ein satter Säugling. C. Morgenstern Also dann: Hoorig isch die Katz! (meinetwegen auch der Bär wie bei den Gengenbachern) - ich bin weg.
Bruno M. schrieb: > Die Zahl geht von 300 runter auf 0 und wieder hoch auf 850. Ist die Zahl > größer 10 ist das kein Problem. Was mache ich aber bei einer Zahl > kleiner 10? So, wie du das geschrieben hast, kann die Zahl entweder genau 10 oder 0 sein. Nix mit Werten dazwischen, also auch keine Prüfung auf < 10, sondern nur auf Null. > Vom Ablauf her muß ich ja erst feststellen, ob die Zahl kleiner 10 ist > und ob sie links oder rechts von der 0 steht. Das ist schon mal falsch erklärt - wenn die Zahl rechts steht, wird diese hochgezählt, also keine Prüfung auf kleiner 10, sondern auf größer 840. Einen Richtungsflag vorsehen und die Sache läuft.
Eine Zahl zwischen 0 und 850, da braucht man nur 10 Bits. Man vergleicht einfach ob das low Byte >= 10 ist, wenn ja, dann 10 abziehen wenn nicht weitermachen cpi LowByte, 10 ; Vergleiche LowByte mit 10 brge Minus10 ; Wenn LowByte größer oder gleich 10 springe zur Subtraktionsroutine ...
Marc V. schrieb: > So, wie du das geschrieben hast, kann die Zahl entweder genau 10 oder > 0 sein. Nix mit Werten dazwischen, also auch keine Prüfung auf < 10, > sondern nur auf Null. Ich weiß nicht woraus du geschlossen hast, daß die Zahlenreihe aus 10er Schritten besteht? Thomas O. schrieb: > Man vergleicht einfach ob das low Byte >= 10 ist, wenn ja, dann 10 > abziehen wenn nicht weitermachen > > cpi LowByte, 10 ; Vergleiche LowByte mit 10 > brge Minus10 ; Wenn LowByte größer oder gleich 10 springe zur > Subtraktionsroutine Erst mal danke, das werde ich mir genauer ansehen!
Bruno M. schrieb: > Marc V. schrieb: >> So, wie du das geschrieben hast, kann die Zahl entweder genau 10 oder >> 0 sein. Nix mit Werten dazwischen, also auch keine Prüfung auf < 10, >> sondern nur auf Null. > > Ich weiß nicht woraus du geschlossen hast, daß die Zahlenreihe aus 10er > Schritten besteht? Daraus: Bruno M. schrieb: > Ich habe eine variable 16-Bit Zahl von der ich die Konstante 10 abziehen > will. > Die Zahl geht von 300 runter auf 0 und wieder hoch auf 850. Wenn für dich eine Konstante 10 keinen 10er Schritt darstellt, dann entschuldige ich mich. Ach ja, Wochenende...
Marc V. schrieb: > Wenn für dich eine Konstante 10 keinen 10er Schritt darstellt, dann > entschuldige ich mich. Tut mir leid, aber diese Logik verstehe ich nicht. Ich kann doch von einer fortlaufenden Zahlenreihe eine beliebige Zahl nehmen und davon 10 abziehen. Thomas O. schrieb: > Eine Zahl zwischen 0 und 850, da braucht man nur 10 Bits. > > Man vergleicht einfach ob das low Byte >= 10 ist, wenn ja, dann 10 > abziehen wenn nicht weitermachen Das stimmt m.E. nicht. 850 sind hex 0x352, d.h. auch bei 0x100 bis 0x109 ist das low Byte < 10. Das gleiche gilt für 0x200 und 0x300. Mir ist noch eingefallen, wie ich die Zahlenreihe erklären kann, u.z. geht sie fortlaufend von -300 bis +850, aber ohne Vorzeichen.
Bruno M. schrieb: > Marc V. schrieb: >> Wenn für dich eine Konstante 10 keinen 10er Schritt darstellt, dann >> entschuldige ich mich. > > Tut mir leid, aber diese Logik verstehe ich nicht. Ich kann doch von > einer fortlaufenden Zahlenreihe eine beliebige Zahl nehmen und davon 10 > abziehen. Du hast aber geschrieben, dass du bei 300 anfängst, also einem ganzzahligen Vielfachen von 10. Wenn du dann immer nur genau 10 abziehst, kann das Ergebnis auch nur ein ganzzahliges Vielfaches von 10 sein. > Mir ist noch eingefallen, wie ich die Zahlenreihe erklären kann, u.z. > geht sie fortlaufend von -300 bis +850, aber ohne Vorzeichen. Genau daran dachte ich auch. Deshalb wäre mein Vorschlag, das eben einfach mit Vorzeichen zu machen. Damit löst sich das Problem in Luft auf. Bei der Verwendung des Wertes kannst du ja den Betrag bilden.
Rolf M. schrieb: > Du hast aber geschrieben, dass du bei 300 anfängst, also einem > ganzzahligen Vielfachen von 10. Wenn du dann immer nur genau 10 > abziehst, kann das Ergebnis auch nur ein ganzzahliges Vielfaches von 10 > sein. OK! Klassisches Mißverständnis > Genau daran dachte ich auch. Deshalb wäre mein Vorschlag, das eben > einfach mit Vorzeichen zu machen. Damit löst sich das Problem in Luft > auf. Bei der Verwendung des Wertes kannst du ja den Betrag bilden. Danke für den Vorschlag, aber inzwischen habe ich das Programm so umgeschrieben, daß ich dieses Problem vermeide.
OK dann muss man eben noch das HighByte auf >0 prüfen und das Carry für den Übertrag ranziehen.
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.