Shift bei uint32_t nur bis 16 Stellen?

Gast #1711255
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
Angehängte Dateien:
Gast #1711315
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));
Gast #1711653
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.