Forum: Compiler & IDEs mal wieder eine ansi c frage...


von Marcel... (Gast)


Lesenswert?

hi zusammen,

wie kann ich am einfachsten in einer 8bit variable ein einzelnes bit 
invertieren ohne die anderen bits zu verändern?

gruss und dank,
marcel

von AndreasH (Gast)


Lesenswert?

Meiner Meinung nach müßte es mit Exclusiv-ODer gehen.

                                    BIT  76543210
Beispiel: Du hast in der Variable: 50h = 01010000b
Wenn Du jetzt das Bit6 invertieren willst, dann
exclusiv-oderiert mit 40h=0100000b. Damit ergibt sich für Deine Variable 
10h=00010000b. Das Bit 4 ist unverändert und die Bits, die 0 waren auch.

Vorausgesetzt Du weisst, welches Bit Du invertieren willst. D.h. es ist 
immer dasselbe. Sonst muss die Maske mit der Du invertieren willst, noch 
geschoben werden.

Oder habe ich das ganze falsch verstanden?

von Peter D. (peda)


Lesenswert?

Bitmanipulationen schreibt man in C so:


#define mybit 1 // Bitnummer (0..7)

char myvar;

myvar |= 1 << mybit; // Setzen

myvar &= ~(1 << mybit); // Löschen

myvar ^= 1 << mybit; // Invertieren

if( myvar & (1 << mybit)) // Testen



Peter

von Notker (Gast)


Lesenswert?

> #define mybit 1 // Bitnummer (0..7)
> char myvar;
> myvar |= 1 << mybit; // Setzen
> myvar &= ~(1 << mybit); // Löschen
> myvar ^= 1 << mybit; // Invertieren
> if( myvar & (1 << mybit)) // Testen

So sieht es aus, wenn ein Assembler-Freak in C zu programmieren versucht 
;-)

Nichts für ungut, aber wieso soll ich den Prozessor jedes Mal damit 
bemühen, ein Bit um mehrere Stellen nach links zu schieben, wenn die 
Bitposition schon zum Übersetzungszeitpunkt klar ist? Was anderes wäre 
es, wenn mybit eine Variable wäre, dann würde ich diesen Aufwand als 
gerechtfertigt ansehen. Ihr Assemblerprogrammierer vergesst immer, dass 
der Assembler arithmetische Ausdrücke im Operanden zum Zeitpunkt der 
Assemblierung in einen festen Wert umsetzt. Bei C wird daraus 
Programmcode erstellt, der zur Laufzeit ausgeführt wird. Und sowas 
schafft nicht gerade effektiven Code.

Meine 0,02$ zum Jahreswechsel

Notker

von Marcel... (Gast)


Lesenswert?

erstmal danke peter für deinen antwort..habs so übernommen und es 
funzt...

aber wie wäre dann deine lösung notker?

bei mir handelt es sich um io ports wo ich aber nur ein bit invertieren 
will

von Sascha Weitkunat (Gast)


Lesenswert?

Dank #define übernimmt der Compiler das einsetzen in den Code und hat 
somit konstante Statements die sofort ausgerechnet werden...

von Peter D. (peda)


Lesenswert?

@Notker:

So denkt nur einer, der sich wohl noch nie den Assemblercode nach dem 
Compilieren angesehen hat ;-)

Das #define ist schon ne gute Sache, macht es doch den Code 
übersichtlicher und leichter, z.B. auf Hardwareänderungen (anderer 
Portpin) zu reagieren.


Wie schon Sascha sagte, ist es so, das ein C-Compiler alle konstanten 
Ausdrücke schon vom Präprozessor ausrechnet und nicht etwa unnützen 
Programmcode generiert.


Also so lange es der besseren Lesbarkeit und universelleren 
Anwendbarkeit dient, ist es durchaus sinnvoll es so hinzuschreiben.

Besonders größere Programme strotzen nur so von #define.

Eine Variante wäre noch folgende:

#define mybit 1 // Bitnummer (0..7)
#define mymask (1 << mybit)

char myvar;

myvar |= mymask; // Setzen


Ist aber für den Compiler keinerlei Unterschied.


Peter

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.