Forum: Compiler & IDEs Shift bei uint32_t nur bis 16 Stellen?


von Stefan B. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!

Irgendwie habe ich ein Problem in einer Funktion bei mir und komme nicht 
auf den Fehler.

Ich habe eine Variable "data" vom Typ uint32_t und will mir von dieser 
das Bit an der Stelle "index" zurückgeben lassen.

Dafür habe ich mir folgende Funktion geschrieben:
1
uint8_t get_bit(uint32_t data, uint8_t index)
2
{
3
    // index may not be higher than 31 for 32 bit value
4
    if(index > 31)
5
        return 0;
6
    
7
    // extract the n-th bit by and-ing "data" with just one binary "1" in n-th bit
8
    // then the result is shifted right by n places to get the bit we want
9
    return (uint8_t)((uint32_t)(data & (uint32_t)(1 << index)) >> index);
10
}

Das funktioniert aber nur bis zum 16. Bit, danach kommt immer "0" 
zurück.

Warum ist das so, hab ich irgendwas übersehen?
Oder kann man das eleganter/schneller realisieren?

Das komplette Programm ist im Anhang.
Verwendet wird AVR Studio 4.18, µC ist ein ATtiny45.

Für Tipps wäre ich sehr dankbar, ich weiß echt nicht mehr weiter...

MfG Stefan

von holger (Gast)


Lesenswert?

return (uint8_t)((uint32_t)(data & (uint32_t)((uint32_t)1 << index)) >> 
index);

von Robert (Gast)


Lesenswert?

return (uint8_t)((data & (1L << 31)) >> index);

von Robert (Gast)


Lesenswert?

besser noch:
return (data & (1L << index))?1:0;

Das spart das zurückshiften.

von Stefan E. (sternst)


Lesenswert?

1
return (data >> index) & 1;

von Rolf Magnus (Gast)


Lesenswert?

Zur Erklärung:

"1 << index" ist vom Typ int, da 1 vom Typ int ist. Dieser Typ ist auf 
dem AVR aber nur 16 Bit groß. Die ganze Casterei danach ändert daran 
nichts mehr.

Es sei noch angemerkt, daß die Funktion in manchen Fällen den Code 
deutlich langsamer machen kann.

Nur der Vollständigkeit halber, hier noch eine Variante: ;-)
1
return !!(data & (1UL << index));

von Stefan B. (Gast)


Lesenswert?

Danke an alle, das wars!

Ist ja auch logisch dass "1" ein int und kein long ist, war wohl gestern 
schon zu spät für mich...
Und im Debugger konnte ich es mir auch nicht anzeigen lassen, 
anscheinend wurde meine extra dafür angelegte Variable wieder 
wegoptimiert.

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.