mikrocontroller.net

Forum: Compiler & IDEs bitmasken in C


Autor: Philipp Karbach (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?!

Autor: Peter (Gast)
Datum:

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

Autor: Sven P. (haku) Benutzerseite
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Philipp Karbach (Gast)
Datum:

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

Autor: excel (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
ich hab mal eben mit EXCEL mir ein Auflistung erstellt

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch ganz nett ist:
#define __BITS(b) \
          ( \
                ( (b / 0x10000000UL) & 1 ) << 7 | \
                ( (b / 0x1000000UL) & 1 ) << 6 | \
                ( (b / 0x100000UL) & 1 ) << 5 | \
                ( (b / 0x10000UL) & 1 ) << 4 | \
                ( (b / 0x1000UL) & 1 ) << 3 | \
                ( (b / 0x100UL) & 1 ) << 2 | \
                ( (b / 0x10UL) & 1 ) << 1 | \
                ( (b / 0x1UL) & 1) << 0 \
              )

#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.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: excel (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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'.

Autor: Rolf Magnus (Gast)
Datum:

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

Autor: excel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!?!?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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! ;)

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.