Forum: Compiler & IDEs Implementierung von Binärzahlen?


von Sascha Weitkunat (Gast)


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

von Peter D. (peda)


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

von Notker (Gast)


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

von Peter D. (peda)


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

von Joerg Wunsch (Gast)


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... ;-)

von Andreas S. (andreas) (Admin) Benutzerseite


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)\
        )

von Sascha Weitkunat (Gast)


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

von Peter D. (peda)


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

von Joerg Wunsch (Gast)


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

von Jonas Diemer (Gast)


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.

von Andreas S. (andreas) (Admin) Benutzerseite


Angehängte Dateien:

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

von Joerg Wunsch (Gast)


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.

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.