bitmasken in C

Gast #1570384
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?!
#1570393
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.
Gast #1570474
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.
Gast #1570486
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
Angehängte Dateien:
Gast #1570851
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!?!?
#1570874
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.
Gast #1570973
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.
Gast #1570979
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.

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