mal wieder eine ansi c frage...

Gast #6406
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?
Gast #6408
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
Gast #6409
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
#6411
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

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