mikrocontroller.net

Forum: Compiler & IDEs Bitmanipulation mit variablen


Autor: Michael B. (gm8816)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
unsigned char a,b,y;

Setzen:
y = a | (1<<b);

Löschen:

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


Ich vermute, dass man mit XOR auch noch was basteln könnte...

Autor: Michael B. (gm8816)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danmke erstmal für die Antworten. Das hat soweit funktioniert.

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der GCC (Zumindest bei WinAVR) kennt _BV(), ist ein Makro für genau 
diese Funktion:
PORTA |= _BV(PB2);

Autor: Günter R. (galileo14)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.