Wie schreibt man Binärzahlen?

Gast #1146042
Lesenswert?

Kann dem Jungen mal jemand ein C-Buch schenken?  Wir könnten ja auch 
eine Spendensammelaktion machen, um so ein Buch zu finanzieren. Oder wir 
starten eine gemeinsame meditative Google-Such-Selbsthilfegruppe um 
brauchbare Tutorials zu finden. :)
Persönliche Seite #1146278
Lesenswert?

Vielleicht ja 'ne sehr konservative Sichtweise, aber auf solche 
Erweiterungen sollte man sich nicht einlassen. Stattdessen sollte man 
lernen, mit hexadezimalen Zahlen zu arbeiten. Das ist nicht sehr 
schwierig, man muss sich gerade mal 16 Bitmuster einprägen.

Hat man das geschafft, dann sieht man die Bitmuster, wenn denn sie 
einen überhaupt interessieren.

Findet man das zu anstrengend und zu schwierig, sollte man sich 
vielleicht nach einem anderen Hobby umsehen - Briefmarken züchten oder 
Goldfische sammeln.

Noch schlimmer als die eigene Bequemlichkeit, mal was zu lernen, ist der 
so erzeugte nichtportierbare Quelltext.

Das ist Schrott.

Und das nur, weil jemand nicht 0xA anstelle von 0b1010 schreiben kann.

Meine Güte.
Gast #1146293
Lesenswert?

Man könnte sich ja auch ein Makro schreiben, jetzt mal auf die Schnelle 
nur für 4 bits (nicht getestet):

#define BIN4(x) (((x/1000)&1)<<3)|(((x/100)&1)<<2)|(((x/10)&1)<<1)|(x&1)
zahl = BIN4(1010)

Der compiler sollte die Zahl dann beim compilieren ausrechnen und nicht 
meckern (hoffentlich) :-)
#1146424
Lesenswert?

Rufus t. Firefly wrote:
> Einfacher aber wäre es, sich auf $Körperteil zu setzen und die 16
> Bitkombinationen eines 4-Bit-Nibbles auswendig zu lernen.
Auswendig lernen ist aber eigentlich Käse. Besser versuchen, zu 
verstehen, wie Binär-, Dezimal- und Hexadezimalsystem funktionieren. 
Dann kann man sich das nämlich in Nullkommanix herleiten...
#1146440
Lesenswert?

A. K. wrote:
> Läuft schnell auf's gleiche raus. Genauso wie man mit der Zeit die
> Zweierpotenzen mindestens bis 2^16 auswendig kennt.
Ist zwar im Prinzip korrekt, aber man sollte Zahlensysteme wenigstens 
grundlegend verstanden haben. Und wenn man das Dezimalsystem versteht, 
dann versteht man auch schnell alle anderen. Leider hakt es da bei 
vielen...
Gast #1146444
Lesenswert?

Mit Portierbarkeit ist es wie mit premature optimization - man kann ganz 
toll viel Zeit darin versenken und am Ende portiert man doch nirgendwo 
hin. Ich habe schon Cross-Platform programmiert und auch schon portiert, 
aber wegen ein paar 0b.... die ein neuer Compiler vieleicht nicht 
versteht, wachsen mir keine grauen Haare. Das erledigt zur Not ein 
kleines Script in ein paar Minuten. Also ziehe ich die angenehmere 
Lesbarkeit fuer mich und jeden Anderen, der mal in den Code guckt, einer 
hypothetischen Portabilitaet allemal vor.
#1146454
Lesenswert?

@Peter Stegemann:
Ist richtig, die Portierbarkeit ist sowieso meist schon durch andere 
Dinge nicht gegeben (fängt schon bei den Bibliotheken an).

Allerdings verleitet die Binärschreibweise gerade Anfänger dazu, selbst 
Dinge, die man gut lesbar unter Verwendung der Bitnamen schreiben 
könnte, in 0bxxxxxxxx zu schreiben, was eine Fehlersuche bzw. Änderung 
am Code zur Tortur machen kann. Imho ist die Binärschreibweise wirklich 
nur da sinnvoll, wo es gewünscht ist, dass man ein Bitmuster direkt 
sehen kann. In den meisten Fällen ist, wenn es um das Setzen von Bits 
geht, die (1 << XYZ)-Schreibweise sinnvoller.

Die Binärschreibweise birgt auch die nicht zu unterschätzende Gefahr, 
dass man sich mit den Stellen verzählt und stundenlang nach dem Fehler 
sucht.
Persönliche Seite #1146459
Lesenswert?

> > Einfacher aber wäre es, sich auf $Körperteil zu setzen und die 16
> > Bitkombinationen eines 4-Bit-Nibbles auswendig zu lernen.
> Auswendig lernen ist aber eigentlich Käse. Besser versuchen, zu
> verstehen, wie Binär-, Dezimal- und Hexadezimalsystem funktionieren.
> Dann kann man sich das nämlich in Nullkommanix herleiten...

Ich wollte die Messlatte nicht allzuhoch legen. "Verstehen" und 
"herleiten können", das ist doch noch viel komplizierter ...


> Also ziehe ich die angenehmere Lesbarkeit  ...

Ab einer gewissen Anzahl Stellen ist eine binärzahl nicht mehr 
"angenehmer" lesbar, das steigert nur die Fehlerrate.

Wer hat schon Lust, in einem Quelltext 16-Bit-Binärzahlen auf 
Vollständigkeit abzuzählen ?

Ich sehe da keinerlei "angenehmere Lesbarkeit".
#1146466
Lesenswert?

Rufus t. Firefly wrote:

> Wer hat schon Lust, in einem Quelltext 16-Bit-Binärzahlen auf
> Vollständigkeit abzuzählen ?

Weiss grad nicht in welcher Sprache, aber irgendwo geht 
0b0001_0010_0100_1000 und das ist dann doch lesbar.

Aber persönlich verwende ich die (1<<x) Notation oder Hex, ja nachdem 
was besser passt. Zentral als Hardware-Konfiguration definiert, damit 
die Module nicht von der Portverteilung abhängen.
Gast #1146468
Lesenswert?

Johannes M. wrote:

> Imho ist die Binärschreibweise wirklich
> nur da sinnvoll, wo es gewünscht ist, dass man ein Bitmuster direkt
> sehen kann. In den meisten Fällen ist, wenn es um das Setzen von Bits
> geht, die (1 << XYZ)-Schreibweise sinnvoller.

Bei mir z.B. bei den Farbdefinitionen fuer's Display. Fuer 
Registergeschichten verwende ich natuerlich die Bitdefinitionen.

> Die Binärschreibweise birgt auch die nicht zu unterschätzende Gefahr,
> dass man sich mit den Stellen verzählt und stundenlang nach dem Fehler
> sucht.

Bei der Hex-Schreibweise gibt es gar nix zu zaehlen, das ist nicht 
wirklich sicherer ;-)
Persönliche Seite #1146472
Lesenswert?

Johannes M. wrote:
> @Peter Stegemann:
> Ist richtig, die Portierbarkeit ist sowieso meist schon durch andere
> Dinge nicht gegeben (fängt schon bei den Bibliotheken an).

AVR-Code kann man durchaus portabel halten.

Komplexere AVR-Prgramme lass ich einfach für den PC übersetzen, da hat 
man ganz andere Analysemöglichkeiten als in einem Simulator. Einen 
kleinen Kompatibilitäts-Header, der Sachen wie avr/pgmspace.h etc. 
rausparametriesiert, und schon geht's los!

Ich hatte den Code ursprünglich auch mit 0b*** gespickt, aber ein 
Host-gcc mechert da rum. Bevor ich ewig rumsuche oder mir den Wolf 
scripte hab ichs also wieder rausgeschmissen und Standard geschrieben.

Auf 0b*** kann man nich nichtmal ein Makro definieren (falls man cpp 
verwendet und sich nicht den Horror mit m4 antun will).

Und bei großen Konstanten wie 0b11001101000010101000010111110011ul würd 
ich auch nicht sagen, daß das die Lesbarkeit fördert. Ein
1
0xcd0a85f3ul // 11001101 00001010 10000101 11110011
tut's doch auch.

Johann
#1146486
Lesenswert?

A. K. wrote:

> Weiss grad nicht in welcher Sprache, aber irgendwo geht
> 0b0001_0010_0100_1000 und das ist dann doch lesbar.

Das dürfte Spin sein.
Da kann man in allen Zahlen solche Trennzeichen einfügen.

Ich verwende die b0101010 Schreibweise auch, aber nur da wo es wirklich 
sinnvoll ist, nämlich bei LCD Controllern.
Da werden in Datenblättern die Register üblicherweise alle in Binär 
angegeben, wieso also den Aufwand machen das im Kopf umzurechnen und 
eventuell noch einen Fehler einzubauen? Wenn das im Code genauso 
aussieht wie im Datenblatt, kann man auch viel besser vergleichen.
Gast #1146495
Lesenswert?

Wow, hier geht es ja heiß her..

ich kann im Kopf von hex nach binär und umgehehrt, jedenfalls in einem 
Byte. Aber manchmal ist binär schreiben praktisch (siehe oben) Ich will 
ja in einer "Hochsprache" programmieren der Übersicht halber. Selbst in 
Assembler kann man binär schreiben..
Gast #1146505
Lesenswert?

CAnfänger wrote:

> ich kann im Kopf von hex nach binär und umgehehrt, jedenfalls in einem
> Byte.

Ich kannte mal einen, der konnte fliessend ASCII-Hex lesen. Irgendwie 
cool, irgendwie aber auch total ueberfluessig...
Gast #1146508
Lesenswert?

Johann L. wrote:

> Komplexere AVR-Prgramme lass ich einfach für den PC übersetzen, da hat
> man ganz andere Analysemöglichkeiten als in einem Simulator.

Was schreibst du denn fuer komplexere AVR-Programme, die du "einfach" 
fuer den PC uebersetzen kannst? Meine komplexeren Programme brauchen die 
Timer, externe Hardware wie EEPROMs, Displays...
Persönliche Seite #1146518
Lesenswert?

CAnfänger wrote:
> Wow, hier geht es ja heiß her..
>
> ich kann im Kopf von hex nach binär und umgehehrt, jedenfalls in einem
> Byte. Aber manchmal ist binär schreiben praktisch (siehe oben) Ich will
> ja in einer "Hochsprache" programmieren der Übersicht halber. Selbst in
> Assembler kann man binär schreiben..

Nunja, C ist eben keine Sprache die von Anfängern oder für Anfänger 
konzipiert wurde...

Jörg Wunsch wrote:
>
> Nun, du weißt doch, wie man einen GCC neu baut (also auch den für den
> Host) :-).

Ich hab noch nie einen canadian cross gebuildet, wär auch mal 
interessant zu sehen, wie das geht. Also ein gcc für das 
build-host-target Tripel linux-mingw32-mingw32 oder linux-mingw32-avr.

So wie ich das sehe ist WinAVR-avr-gcc kein canadian cross, sondern ein 
native build unter msys/mingw32?

Johann
Gast #1146543
Lesenswert?

> Ich kannte mal einen, der konnte fliessend ASCII-Hex lesen. Irgendwie
> cool, irgendwie aber auch total ueberfluessig...

Das koennen alle aelteren Leute. Ich konnte auch mal alle Z80 
Hexcodes/Assemblerbefehle auswenig. (naja wenigstens die wichtigsten 
50%)
Lag aber nur daran das es damals noch keinen Assembler gab und man
alles auf Papier von Hand machen musste. Ausserdem hasse ich seitdem 
relative Spruenge. :-)

Olaf
Gast #1146548
Lesenswert?

Also ich habe schon in anderen Sprachen programmiert und "C" steht bei 
mir für "cryptic". Paßt vom Stil zu Deinem Sprachdurcheinander im 
letzten Absatz. "Ich hab noch nie einen canadian cross gebuildet" lach 
dann schreib lieber alles auf englisch and try to impress even more with 
it. :-)

Aber jetzt seh ich mal wie verwöhnt ich z.B. von MS Visual Studio bin. 
AVR Studio dagegen ist echt hart. Kein Automatische Vervollständigung, 
immer auf Groß- und Kleinschreibung achten, keine Variablenanpassung, 
die Stelle wo was deklariert ist bzw. defines / .equ in externen Dateien 
muß man selber suchen etc. etc.

Aber ich beiße mich durch! :-)
Gast #1146553
Lesenswert?

Olaf wrote:

> Das koennen alle aelteren Leute. Ich konnte auch mal alle Z80
> Hexcodes/Assemblerbefehle auswenig. (naja wenigstens die wichtigsten
> 50%)

Der war damals vieleicht 2-3 Jahre aelter als ich und heute 
wahrscheinlich auch noch ;-) Und im Uebrigen war er ansonsten kaum in 
der Lage, eine Loesung zu produzieren - nur kleine, zwar interessante 
aber kaum verwendbare Spielereien.
Moderator Persönliche Seite #1146631
Lesenswert?

Johann L. wrote:

> Ich hab noch nie einen canadian cross gebuildet, wär auch mal
> interessant zu sehen, wie das geht. Also ein gcc für das
> build-host-target Tripel linux-mingw32-mingw32 oder linux-mingw32-avr.

Verstehe ich nicht ganz.  Wenn du als Ziel ein mingw32 haben willst,
warum baust du dann den Compiler nicht gleich native dort?

Ich meinte das ja auch nur, weil du mit dem GCC 4.3 ohne Patches
in den ,,Genuss'' der 0b-Implementierung kommst ;-) und dann deine
Quellen wieder 1:1 portierbar sind.

> So wie ich das sehe ist WinAVR-avr-gcc kein canadian cross, sondern ein
> native build unter msys/mingw32?

Ja, das müsste dann mingw32-mingw32-avr sein, ggf. aber auch
cygwin-mingw32-avr -- so genau habe ich die build triplets nie
verstanden.  Ich glaube, Eric baut am Ende alles unter Cygwin, damit
er nicht in zwei verschiedenen Umgebungen bauen muss.  Manche Dinge
(wie AVaRICE oder Insight) brauchen die Posix-API-Emulation von
Cygwin (auch zur Laufzeit, d. h. sie hängen von der cygwin1.dll ab).
Andere Teile (binutils, GCC, AVRDUDE) werden aber so konfiguriert,
dass sie trotz Bauens innerhalb Cygwin zur Laufzeit pures Win32-API
benutzen, also mingw32 (und damit nicht von cygwin1.dll abhängen).
#1146639
Lesenswert?

Peter Stegemann wrote:
> Bei mir z.B. bei den Farbdefinitionen fuer's Display.
Oder für Steuersequenzen für nen Schrittmotor oder für ein einfaches 
LED-Lauflicht. Aber da hört's dann auch schon auf...

> Bei der Hex-Schreibweise gibt es gar nix zu zaehlen, das ist nicht
> wirklich sicherer ;-)
Wie gesagt, es kommt drauf an, um was für Werte es sich handelt.
Bitmuster zur Ansteuerung eines Ports -> kann man durchaus in binär 
machen.
Bits setzen in Steuerregistern -> Bitte in (1 << 
FIRLEFANZ)-Schreibweise.
Belegen von Registern / Variablen mit Zahlenwerten -> Dezimal- oder 
Hexadezimalschreibweise, je nachdem, was für ein Wert es sein soll.

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