Forum: Compiler & IDEs bitmasken in C


von Philipp Karbach (Gast)


Lesenswert?

Ich bin gerade etwas genervt. Bin mir nicht genau sicher in welchem 
compiler das problem liegt. Ich möchte einfach in visual c++ eine 
bitmaske in einen integer schreiben. Dabei bietet sich bei avr-gcc 
(nicht sicher ob es bei gcc auch geht!) einfach die schreibweise 
0b10101010 etc. an. In meinem VC Programm geht dies nicht. Naja ich 
könnte alle bitmasken einfach konvertieren aber das finde ich blöd. Hat 
irgendjemand eine Idee wie man VC auf einfache weise beibringt dass die 
paar zahlen eine lächerliche bitmaske sind?!

von Peter (Gast)


Lesenswert?

0b10101010 = (1<<8)+(1<<6)+(1<<4)+(1<<2)

von Sven P. (Gast)


Lesenswert?

Wahlweise:
Schreib ein Makro, welches aus einer Dezimalzahl die Bits extrahiert, 
oder definiere dir Makros à la B00000000, B00000001.

von Karl H. (kbuchegg)


Lesenswert?

Philipp Karbach schrieb:
> Ich bin gerade etwas genervt.

Musst du nicht.
Lies ein gutes C-Buch und du findest heraus, dass es die 
Binärschreibweise in C eigentlich gar nicht gibt, sondern eine 
eigenmächtige Erweiterung des gcc darstellt.

> irgendjemand eine Idee wie man VC auf einfache weise beibringt dass die
> paar zahlen eine lächerliche bitmaske sind?!

Eine portable Lösung wäre zb

#define B00000000   0x00
#define B00000001   0x01
#define B00000010   0x02
#define B00000011   0x03
....
#define B11111110   0xFE
#define B11111111   0xFF

diese define legt man sich einmal in ein Header File und inkludiert es 
wenn man es braucht.

von Philipp Karbach (Gast)


Lesenswert?

hmmm das ist zwar ziemlich um die ecke rum aber wenn es die sache 
erfordert :). danke.

von excel (Gast)


Angehängte Dateien:

Lesenswert?

ich hab mal eben mit EXCEL mir ein Auflistung erstellt

von Sven P. (Gast)


Lesenswert?

Auch ganz nett ist:
1
#define __BITS(b) \
2
          ( \
3
                ( (b / 0x10000000UL) & 1 ) << 7 | \
4
                ( (b / 0x1000000UL) & 1 ) << 6 | \
5
                ( (b / 0x100000UL) & 1 ) << 5 | \
6
                ( (b / 0x10000UL) & 1 ) << 4 | \
7
                ( (b / 0x1000UL) & 1 ) << 3 | \
8
                ( (b / 0x100UL) & 1 ) << 2 | \
9
                ( (b / 0x10UL) & 1 ) << 1 | \
10
                ( (b / 0x1UL) & 1) << 0 \
11
              )
12
13
#define BITS(b) __BITS(0x ## b ## UL)

So oder so ähnlich. Das mit dem '0x' ist nötig, damit aus führenden 
Nullen keine Oktalzahlen werden.

von Sven P. (Gast)


Lesenswert?

excel schrieb:
> ich hab mal eben mit EXCEL mir ein Auflistung erstellt

Das geht schief, das erste Zeichen des Makronamens muss ein Buchstabe 
sein.

von excel (Gast)


Angehängte Dateien:

Lesenswert?

excel schrieb:
> ich hab mal eben mit EXCEL mir ein Auflistung erstellt

Das geht schief, das erste Zeichen des Makronamens muss ein Buchstabe
sein.

ja hast Recht. Dann müsste man(n) eben vor dem b und vor dem x jeweils 
die Null rauslöschen

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> ja hast Recht. Dann müsste man(n) eben vor dem b und vor dem x jeweils
> die Null rauslöschen

Nur vor dem 'b', auf keinen Fall vor dem 'x'.

von Rolf Magnus (Gast)


Lesenswert?

Warum nicht einfach Hex-Schreibweise nehmen? Mit ein bischen Gewöhnung 
kann man die genauso gut lesen.

von excel (Gast)


Lesenswert?

"Nur vor dem 'b', auf keinen Fall vor dem 'x'."

da steh ich jetz auf dem Schlauch, wenn ich mit den defines z.b. 
schreibe 0b00000010 wird das b00000010 doch ersetzt durch x02 --> also 
steht dann 0x02 da!?!?

von Karl H. (kbuchegg)


Lesenswert?

excel schrieb:
> "Nur vor dem 'b', auf keinen Fall vor dem 'x'."
>

Nimm bitte den Knopf "Antwort mit Zitat".
Dann lässt sich leichter verfolgen, wer auf wessen Posting antwortet und
wer was gesagt hat


> da steh ich jetz auf dem Schlauch, wenn ich mit den defines z.b.
> schreibe 0b00000010 wird das b00000010 doch ersetzt durch x02 --> also
> steht dann 0x02 da!?!?

Das wird jetzt schwierig dir zu erklären.

Auch wenn wir immer sagen, der Präprozessor macht nur Textersetzung, so 
hält er sich doch an gewisse Regeln. Kurz und gut:
Wenn der Präprozessor in
0b00000010  den b00000010 Teil ersetzt, dann kommt da nicht 0x02 raus 
sondern 0 x02. Also 2 sog. "Tokens" hintereinander. Einmal das Token für 
die Konstante 0 und dann "x02" als davon getrennter Token.

von Simon K. (simon) Benutzerseite


Lesenswert?

Rolf Magnus schrieb:
> Warum nicht einfach Hex-Schreibweise nehmen? Mit ein bischen Gewöhnung
> kann man die genauso gut lesen.

Und sogar besser. Bei 16 oder 32 Bit Binärzahlen viel Spass beim 
abzählen der Stellen! ;)

von Ulrich (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Lies ein gutes C-Buch und du findest heraus, dass es die
> Binärschreibweise in C eigentlich gar nicht gibt, sondern eine
> eigenmächtige Erweiterung des gcc darstellt.

soweit ich informiert bin ist das nichtmal eine erweiterung der der gcc 
einführt, sondern dass war doch ein patch für winavr ?
Weil ich habe mir auch mal avr-gcc unter linux eingerichtet und da hat 
defaultmässig afaik die bitmasken nicht funktioniert.

von Sven P. (Gast)


Lesenswert?

Ulrich schrieb:
> Karl heinz Buchegger schrieb:
>> Lies ein gutes C-Buch und du findest heraus, dass es die
>> Binärschreibweise in C eigentlich gar nicht gibt, sondern eine
>> eigenmächtige Erweiterung des gcc darstellt.
>
> soweit ich informiert bin ist das nichtmal eine erweiterung der der gcc
> einführt, sondern dass war doch ein patch für winavr ?
Es ist eine Erweiterung von GCC. Ob dir ursprünglich mal aus einem Patch 
herrührte, weiß ich aber nicht.

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.