mikrocontroller.net

Forum: Compiler & IDEs Implementierung von Binärzahlen?


Autor: Sascha Weitkunat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nabend und frohes Jahr 2003!

Langsam fängt es mich an zu stören dass der GCC keine Zahlen in 
Binärschreibweise unterstützt...

Ich habe mir, wie viele andere wohl auch, per
#define b00000000 0
#define b00000001 1
#define b00000010 2
#define b00000011 3
[...]
abhilfe geschaffen, lieber währe es mir jedoch wenn der Syntax der selbe 
währe wie bei den Hex-Zahlen: z.B.: 0b00000010

Ich kenne mich mit den Compiler selber nicht so gut aus, aber vielleicht 
kann man ihm das in irgendeiner File begreiflich machen?! Per #define 
geht es ja leider nicht, wegen der führenden "0"..

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man kann Binärzahlen mit folgendem Macro schreiben:

#define BIN8(b7,b6,b5,b4,b3,b2,b1,b0) ((unsigned char)\
                          (b0 << 0)\
                        | (b1 << 1)\
                        | (b2 << 2)\
                        | (b3 << 3)\
                        | (b4 << 4)\
                        | (b5 << 5)\
                        | (b6 << 6)\
                        | (b7 << 7))

z.B.:

x = BIN8(0,0,0,0,0,0,1,0);


Peter

Autor: Notker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da gab es auch mal etwas mit einem Bitfeld in Kombination mit einem 
Makro.
Aber so richtig begeistern kann dies alles nicht. Eigentlich schade.

Gibt es hier wirklich keine elegantere Lösung?

Notker

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Notker,

ist alles reine Gewöhnungssache, ich komme mit meinem Macro ganz gut 
zurecht.

Wenn Du unbedingt Deine eigenen Syntaxregeln aufstellen willst, must Du 
eben den C-Compiler selber schreiben.


Jede Sprache hat nun mal ihre Unterschiede und die muß man lernen.


Peter

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Interessant fände ich zuweilen 0b als Prefix auch, andere Compiler
können wohl sowas, und es scheint auch dem Standard nicht komplett
zu widersprechen, das als Erweiterung zu haben.

Ändern müßte man die Funktion cpp_classify_number() in der Datei
cppexp.c, falls das jemand mal tun will... ;-)

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das mit 0b wäre schon nett, aber wenn es dann irgendwann Programme gibt 
die sich nur noch mit gepatchten GCCs kompilieren lassen kann das ja 
auch nicht Sinn der Sache sein... oder wie stehen die Chancen dass man 
sowas in den offiziellen GCC aufnehmen würde?

Freunde von Monster-Makros können sich hiermit behelfen (bei Bedarf 
verlängern):

#define BIN(x) \
        ((x%10)\
         |(((x/10)%10)<<1)\
         |(((x/100)%10)<<2)\
         |(((x/1000)%10)<<3)\
         |(((x/10000)%10)<<4)\
         |(((x/100000)%10)<<5)\
         |(((x/1000000)%10)<<6)\
         |(((x/10000000)%10)<<7)\
        )

Autor: Sascha Weitkunat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ob nun "mitdenkendes" Makro oder die Liste von defines... Das ist Jacke 
wie Hose.

Nicht dass es ja garnicht geht, mir geht es halt nur um den letzten 
Schliff, das "0b" davor. Wenn man für den PC programmiert ist es relativ 
trivial, da man es eigentlich niemals braucht... aber bei den 
Mikrocontrollern sieht es da ja grundlegend anders aus...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Andreas,

super Macro, werde ich gleich in meine common.h kopieren !

Vielleicht auch eine Version geteilt in 2 Vierergruppen, damit sichs 
besser lesen läßt.


Peter

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn schon mit 0b, dann nur so, daß es auch im offiziellen gcc drin
ist, alles andere wäre in der Tat Unsinn.

Ob die gcc-Entwickler sowas akzeptieren würden, weiß ich nicht, aber
sie waren in der Vergangenheit großzügig mit eigenen Erweiterungen,
die über den Standard hinausgehen, insofern kann ich mir das schon
vorstellen (zumal es ja Präzedenzfälle gibt, irgendein Intel-Compiler
glaub ich).

Autor: Jonas Diemer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, das problem ist mir noch nicht so einsichtig. man kann binär->hex 
doch relativ schnell im kopf rechnen. besonders, wenn man das andauernd 
braucht sollte sich das doch schnell üben.

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
cpp_classify_number() gibt's in gcc 3.2 nicht, die relevanten Stellen 
sind lex_number() (Zeile 880) in c-lex.c und parse_number() (Zeile 116) 
in cppexp.c.
Der Patch für's 0b-Prefix ist im Anhang (gcc 3.2).

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da gcc 3.2 sowieso die aktuelle Version von avr-libc nicht mehr
unterstützt, was willst Du ihn da erst noch patchen?

Im übrigen sollte wohl auch die Ausschrift "illegal digit in octal
number" (oder so ähnlich) noch angepaßt werden. ;-)

Gedanklich war ich in den 3.3er Quellen auch schon so weit
vorgedrungen, ich hatte es nur noch nicht ausprobiert.

Irgendwo müßte man natürlich dann auch noch die Doku updaten, bevor
man das zu GNU schicken kann.

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.