Forum: Compiler & IDEs Masken zu setzen/löschen von Bits


von Harry Jacobsen (Gast)


Lesenswert?

Ich habe im Zusammenhang mit dem GNU Compiler eine neue Art gelernt,
einzelne Bits zu setzen. Ich nehme als Beispiel einmal das Setzen des
Bit7:
GNU-Methode: Testbyte |= (1<<7);
meine übliche Methode:Testbyte |= 0x80;

Nun meine Frage: ich bin der Meinung, dass beide Methoden gleichwertig
sind, was Laufzeit und Codegrösse angehen, oder irre ich mich? Dass man
nur mit der ersten Methode die vordefinierten Bits aus den
Header-Dateien der Prozessoren verwenden kann, ist schon klar.Gibt es
sonst noch Gründe, die eine oder ander Methode vorzuziehen?

Viele Grüsse
Harry

von Stefan Kleinwort (Gast)


Lesenswert?

Beide Methoden sind gleichwertig und erzeugen denselben Code.

Es gibt aber Befehle, für die die Bitnummer (0 bis 7)angegeben werden
muss. Deshalb ist es sinnvoll, grundsätzlich die Bitnummern zu
verwenden und bei Bedarf durch (1<<7) auf die Maskendarstellung
umzurechnen.

Normalerweise gibst Du die Bitnummer auch symbolisch an und nicht als
nackte Zahl. Statt (1<<7) kannst Du _BV(7) schreiben (ich denke,
übersetzt heisst das Bit-Value(7)).

Stefan

von hans (Gast)


Lesenswert?

naja sie sind gleichwertig weil der compiler eigentlich erkennen müsste,
dass es sich hier um constanten handelt sprich aus dem 1<<7 wird 80hex
;)

ich ziehe 1<<7 vor weil man da sich nix merken muss und man sofort
sieht das wievielte bit man da setzt...

nebenbei bemerkt...wenn du z.b defines hast wo drinnen steht welches
bit das ist (z.b uart bei der config) dann mach ich auch
1<<DEFINE_VOM_BIT und das passt dann...da wird nix herumgerechnet...das
passt einfach...

ich find das einfach angenehmer...

und man weis auch wenn man siehst sofort, dass x&=~(1<<5); das 5. bit
löscht ;)

und daher nehmen die gnu-leute auch das soo gerne ;)
die haben ja auch den gcc gebastelt weil sie zu faul sind sich für ich
weis nicht wieviele compiler die eigenheiten zu merken...
brauchen sie einen compiler der java,c,c++,perl,... ausspucken kann bzw
aus diesen sources executeables macht G

73 de oe6jwf / hans

von Harry Jacobsen (Gast)


Lesenswert?

Es scheint also wie vermutet Geschmacksache zu sein, und das ist schön
so.

Also lösche ich Bit 5 weiter so, weil es für mich leichter lesbar ist:

#define MASK_BIT5 0x20 /*in irgendeinem passenden Header-File*/
x &= ~MASK_BIT5 ;

Viele Grüsse
Harry

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.