Division durch 10

#2347572
Lesenswert?

Hallo,
ich habe schon das Forum durchstöbert aber keine Lösung gefunden.
Ich möchte eine 4-stellige Dezimalzahl in die einzelnen Ziffern 
zerlegen. Habe mal irgendwo eine "Bitmanipulation" als Ersatz für die 
Division durch 10 gesehen, leider finde ich es nicht wieder.
Wer hat eine Lösung?
Atmega 16 mit AVR Studio in C.

Gruß Marc

Besten Dank im voraus.
Gast #2347649
Lesenswert?

Ich denke mal du erinnerst dich da an die Division bzw Multiplikaion 
durch bitweises verschieben. Das funktioniert aber nur für Potenzen von 
zwei
Also z.B.
12 * 2  = 12 << 1
12 * 4  = 12 << 2
12 * 8  = 12 << 3
12 * 16 = 12 << 4
usw.

Division ist dann eben genau andersrum. Wie auch immer - für die 10 
funktioniert das so ohne weiters nicht.
#2347757
Lesenswert?

Marc Höner schrieb:
> Besten Dank für die vielen Antworten.
> Die einfache Version mit / und % funktioniert leider nicht. Irgendwie
> scheint es bei der Division zu Ungenauigkeiten zu kommen.

Ungenauigkeiten?
Bei einer Integer Division?

Du beliebst zu scherzen. Zeig mal.

(Ich lehn mich mal aus dem Fenster und behaupte du hast Flieskomma im 
Spiel und keine Rundungskorrektur gemacht)
#2347861
Lesenswert?

Hier der Code:

        switch (xpdr_cursor) {
        case 1:
          value = xpdr_code/1000;
          break;
        case 2:
          value = xpdr_code/100;
          value = value%10;
          break;
        case 3:
          value = xpdr_code/10;
          value = value%10;
          break;
        case 4:
          value = xpdr_code%10;
          break;
        default:
          break;

xpdr_code ist max 4-stellig, soll in seine digits zerlegt werden und ist 
int16, value ist int8

Fehler habe ich bei case 3 (3. Stelle), hier werden teilweise, aber 
nicht immer falsche Werte ausgegeben. Das mit der Division war so eine 
Vermutung, hatte ich mal gehört. Bin nicht so der Experte.
Fliesskomma ist allerdings nicht im Spiel.

Gruß Marc
Persönliche Seite #2347877
Lesenswert?

Wenn die Division im Compiler – zumal die durch 10 – fehlerhaft wäre, 
dann wär das schon längst aufgefallen. Der Fehler stekt vermutlich 
woanders, in der Ausgaberoutine, Glitch, Stacküberlauf, Puffer zu 
klein...

Dein Beispiel lässt sich lzudem nicht übersetzen und nachvollziehen, da 
es kein gültiger C-Code ist: Keine Deklarationen, etc.
#2347894
Lesenswert?

Das Problem ist gelöst.

Marc Höner schrieb:
> case 3:
>           value = xpdr_code/10;
>           value = value%10;

Der Fehler lag in der Variablendeklaration. Ich habe jetzt value als 
int16 deklariert und alles klappt. Ist ja auch logisch. Wenn ich eine 
4-stellige Zahl durch 10 teile können Werte größer 255 herauskommen. Man 
muss nur mal drauf gestossen werden.
Besten Dank an alle die Tipps gegeben haben.
Gruß Marc

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