Bitmanipulation mit variablen

OP #725627
Lesenswert?

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 #725663
Lesenswert?

> 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?
#727156
Lesenswert?

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 #727175
Lesenswert?

> ... 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

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