Bitmanipulation mit variablen

OP #725627
Hallo,
ich habe zwei Variablen. Die erste Variable soll das zu manipulierende 
Byte enthalten und die zweite soll die Bitnummer des zu manipulierenden 
Bits enthalten. Wie mache ich das jetzt in C.
Normalerweise mache ich es immer so: out |= (1<<0); Anstelle der 0 soll 
jetzt eine Variable stehen die dann die Werte 0..7 enthalten kann. In 
assembler habe ich so eine routine mal geschrieben aber vielleicht gibt 
es in C sowas schon integriert.
Gast
> Normalerweise mache ich es immer so: out |= (1<<0); Anstelle der 0
> soll jetzt eine Variable stehen die dann die Werte 0..7 enthalten
> kann.

Dann schreib die Variable doch einfach anstelle der 0 hin. Oder wo ist
das Problem?
STK500-Besitzer wrote:
> unsigned char a,b,y;
>
> Löschen:
>
> y = a & ~(1<<b);
>

Habt ihr euch mal den Kommentar im avr-libc Reference Manual zu diesem 
Thema angesehen? Dort (in Version 1.4.3 auf S. 197) gibt es das Kapitel 
7.3.21 "Why does the compiler compile an 8-bit operation that uses 
bitwise operators into a 16-bit operation in assembly?"

Dort wird (mindestens) empfohlen, daß man einen Cast setzt:

y = a & (unsigned char)~(1<<b);

Ich mache es mal so, mal anders, bemerke aber keinen Unterschied 
(funktioniert in beiden Fällen). Kann jemand dazu mal Stellung nehmen? 
Ist der Cast wirklich notwendig?
Gast
> ... bemerke aber keinen Unterschied (funktioniert in beiden Fällen).

Ich auch nicht. Der Compiler (avr-gcc 4.2.2) erzeugt einen
16-Bit-Shift und ein 8-Bit-And, egal ob mit oder ohne Cast. Der
16-Bit-Shift bleibt auch dann, wenn man die 1 in (unsigned char)
castet.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.