Programm: Dezimal in Binär umrechnen
-
Dulfried schrieb:
könntet ihr mir bitte auch noch verraten, wie ich es schaff den string in seinen numerischen zahlenwert umzurechnen?
Das zeigen die Beispielcodes diverser Nutzer doch bereits.
http://de.wikipedia.org/wiki/StellenwertsystemAllerdings verstehe ich nicht, was man davon hat den string überhaupt in seinen numerischen zahlenwert umzurechnen und nicht direkt mit ihm zu rechnen (ist allerdins in der aufgabe vorgeschrieben)
Wie rechnest du denn mit Zeichenketten?
-
ja mit den beispielprogrammen meckert mein compiler immer.
char eingabe_feld[17];
int zahl;ich muss für die eingabe folgendes benutze: scanf("%c%16s", &zahlentyp, eingabe_feld)
um dann den numerischen Zahlenwert zu bekommen habe ich folgendes gemacht:
numwert = eingabe_feld - 48;Der compiler streicht mir das = an und "ein wert vom typ char* kann keiner Entität vom vom typ unsigned char zugewiesen werden.
-
numwert = eingabe_feld - 48;
Du musst schon mit den einzelnen Stellen von
eingabe_feld
je nach Position und dem Stellenwert je nach gewünschtemzahlentyp
(Zahlensystem?) rechnen ...Wahrscheinlich ist
%c
fürzahlentyp
das falsche Format. Zeig doch mal vollständigen Code!
-
In Erwartung von etwas bashing...
Ich finde es immernoch "quite cool". :pMit führenden Nullen:
char line[100] = "\0"; unsigned ich = 3001; unsigned i; for( i = 0x8000; i > 0; i >>= 1 ) strcat( line, (ich & i) == i ? "1" : "0" ); printf( "%s" , line );
EDIT:
und noch etwas reduzierter:strcat( line, ich & i ? "1" : "0" );
EDIT #2:
noch übler:for( i = 0x8000; i > 1; i >>= 1, strcat( line, ich & i ? "1" : "0" ) );
EDIT #3 hat leider doch nicht funktioniert.
-
Ah, ein Crank-Code-Contest ... ich mach mit
-
Swordfish schrieb:
Ah, ein Crank-Code-Contest ... ich mach mit
LOL, schaff es printf auch noch in die for-Schleife zu integrieren und du hast den Pokal.
-
darfs auch
putchar()
sein? :pfor( unsigned i = 17; i; putchar( "10"[ !( ich & 1 <<-- i ) ] ) );
-
for( i = 0x8000; i; i >>= 1, strcat( line, ich & i ? "1" : "0" ), i == 1 && printf( "%s", line ) );
macht alles in einer Zeile.
EDIT:
ist eher was für den code obfuscation contest
-
Im Golfen bin ich trotzdem vorn :p
for( i = 17; i-- || puts( line ); line[ 16 - i ] = "10"[ !( ich & 1 << i ) ] );
// edit: 55 ohne whitespace
-
Kann kein C++ > vor einigen Jahren. Bekomme aber demnächst VS 2013 und dann geht's richtig ab...
-
ähm. das ist C.
-
"10"[ !( ich & 1 << i ) ]
sieht mir schwer nach "ich bin kein Zeh" aus
Dummerweise funktioniert mein code leider nicht mit z.B. 0x8000.
Das ärgert mich jetzt aber.So geht's:
for( i = 0x8000; i; strcat( line, ich & i ? "1" : "0" ), i >>= 1, !i && printf( "%s", line ) );
und ohne führende Nullen.
for( i = 0x8000; i; strcat( line, ich & i ? "1" : strlen( line ) ? "0" : "" ), i >>= 1, !i && printf( "%s", line ) );
-
EOP schrieb:
"10"[ !( ich & 1 << i ) ]
sieht mir schwer nach "ich bin kein Zeh" aus
Ist es aber. Das ist kein Lambdaausdruck oder was immer man vielleicht auf den ersten Blick denken mag. Das ist ein Zeichenkettenliteral(Arraytyp) direkt gefolgt von einem Elementzugriff auf eben dieses Literal. Wenn Swordfish wirklich böse wäre, hätte er
(!( ich & 1 << i ))[ "10"]
oder*("10" + !( ich & 1 << i))
geschrieben, was aber ein paar Zeichen mehr sind (dafür aber nochmal eine Spur obskurer).Wobei das Programm bei mit segfaulted. Die Abbruchbedingung muss
i-- || puts( line ) < 0
lauten, da puts im Erfolgsfall einen nicht-negativen Wert zurück gibt. Bei meiner Implementierung ist das eine positive Zahl, bei Swordfishs Testsystem anscheinend 0. Da das unnötigerweise zwei Zeichen mehr sind, bietet es sich an, das ganze puts aus der Schleife zu verbannen, so entfallt auch das||
.PS:
!( ich & 1 << i)
geht natürlich auch besser als(ich >> i & 1))
und Umdrehen der Zeichen im Literal. So spart man sich das!
.
-
SeppJ schrieb:
PS:
!( ich & 1 << i)
geht natürlich auch besser als(ich >> i & 1))
und Umdrehen der Zeichen im Literal. So spart man sich das!
.wenns ein
uint16_t
ist.// edit:
Ok, dann sind wir jetzt bei
5452 - wer sagt daß die Eingabeich
sein muss?for(i=17;i--||puts(line)<0;line[16-i]="01"[v>>i&1]);
-
Wenn wir schon bei obskur und unlesbar sind:
#include<stdio.h> _(I){if(I)_(I>>1);putchar(48+(I&1));}main(){_(3001);}
Geht aber sicher noch besser.
-
SeppJ schrieb:
EOP schrieb:
"10"[ !( ich & 1 << i ) ]
sieht mir schwer nach "ich bin kein Zeh" aus
Ist es aber. Das ist kein Lambdaausdruck oder was immer man vielleicht auf den ersten Blick denken mag. Das ist ein Zeichenkettenliteral(Arraytyp) direkt gefolgt von einem Elementzugriff auf eben dieses Literal
Ich wusste nicht, daß sowas in C geht.
Wiedermal: Man kann immer noch was dazulernen und selbst ich als alter Knochen freue mich darüber. Wobei ich es wohl nicht in der Form verwenden werde, weil zu unoffensichtlich (falls es dieses Wort noch nicht geben sollte, gibt es es ab sofort :)) ist, was gemeint ist.
-
EOP schrieb:
SeppJ schrieb:
EOP schrieb:
"10"[ !( ich & 1 << i ) ]
sieht mir schwer nach "ich bin kein Zeh" aus
Ist es aber. Das ist kein Lambdaausdruck oder was immer man vielleicht auf den ersten Blick denken mag. Das ist ein Zeichenkettenliteral(Arraytyp) direkt gefolgt von einem Elementzugriff auf eben dieses Literal
Ich wusste nicht, daß sowas in C geht.
Wiedermal: Man kann immer noch was dazulernen und selbst ich als alter Knochen freue mich darüber.Ist doch schön.
Was sagst du denn zu meinem Vorschlag? (Ja, das ist das gesamte Programm!) Oder sind die dort benutzten Tricks ein alter Hut, weil du C im K&R-Stil kennen gelernt hast
?
PS: Noch eine kleine Verbesserung, wer braucht schon Schlüsselworte?
_(I){I?_(I>>1),putchar(48+(I&1)):7;}main(){_(3001);}
So entfällt auch die doofe führende 0, die vorher noch drin war.
edit: 7 statt 0, zur weiteren Verwirrung des Lesers :p
edit2: Wieder 1 Zeichen gespart:_(I){I?_(I/2),putchar(48+(I&1)):7;}main(){_(3001);}
Überhaupt kann sich ja auch das include<stdio.h> sparen, putchar nimmt schließlich schon int als Argument und Rückgabewert, die implizite Deklaration passt also. Obiges ist also tatsächlich das gesamte Programm
-
@PS ... boah, ich wollts grad posten
//edit: zwar länger, aber schöner find ich trotzdem
o(O){O&&o(O/2),write(1,"01"+(O&1),1);}main(){o(3001);}
50:
_(I){I&&_(I/2),putchar(48+(I&1));}main(){_(3001);}
48:
_(I){I&&_(I/2),putchar(48|I&1);}main(){_(3001);}
-
Swordfish schrieb:
//edit: zwar länger, aber schöner find ich trotzdem
o(O){O?o(O/2),write(1,"01"+(O&1),1):2;}main(){o(3001);}
Damit kann der Threadersteller auch mehr lernen, da es auch für andere Basen funktioniert
:
o(O){O?o(O/16),putchar("0123456789ABCDEF"[(O%16)]):2;}main(){o(3001);}
Das ist schließlich sogar die kanonische Methode zur Ausgabe in einem bestimmten Stellenwertsystem, also genau das, wonach ursprünglich gefragt war. Bloß ein "bisschen" ungünstig aufgeschrieben.
Man kann natürlich auch & statt % benutzen, so lange die Basis eine Zweierpotenz ist:
"0123456789ABCDEF"[(O&15)]
Warum sollte man? Weil man es kann!PS:
Swordwfish schrieb:
_(I){I&&_(I/2),putchar(48|I&1);}main(){_(3001);}
Ich wusste doch, da geht noch was! Ich mag das 48|I&1
-
You freak me out!
Ich bin dann raus aus dem code obfuscation contest. Mein level ist eindeutig zu niedrig.
Und ja SeppJ, ich hab richtig oldschool-C gelernt. Ich mache alles immer noch q+d; obwohl meistens nicht q aber d. :p