Für Anfänger bzw. Advanced Coders - Ein kleiner Buchtip ! {
-
Original erstellt von HumeSikkins:
**Oha. Bitte sagt mir, dass nicht ich mit meinem ersten Einwurf für die jetzt herschende schlechte Stimmung verantwortlich bin.Für mich sind viele der Einwände von Daniel E. neu. Insofern empfinde ich sie weder als arrogant noch als sonst wie ärgerlich. Eher als extrem lehr- und hilfreich.**
Hey, so schlimm ist der Zustand doch gar nicht.
-
Original erstellt von volkard:
Mir ist scheiß-egal, was du tolerierst. Mrn toleriert meine Lösung. Die Lücke bei INT_MIN war von anfang an bekannt, ich hab sie auch im chat gesagt aber der einfachheit halber nicht gepostet.Aha.
Kommt auf die Verwendung an. Fast immer wird nicht der ganze Wertebereich gebraucht. So überwiegend sogar, daß ich bei deinem Gerede zunächst an Realitätsverlust denken muß.
Das ist wiederum mir ziemlich egal.
Besonders unterstützt durch Annahmen wie padding bits in integers und bytes, die nicht 8 bits groß sind.
Das ist idR eine Gedankenspielerei (aber eine PDP-10 hat zB 9-bittige chars).
Wenn ich eine Lösung schreiben wollte, die "manchmal für eingeschränkte Werte von" funktionieren soll, dann ist das vielleicht ein Ansatz, mit dem ich in der Praxis > 90% der Probleme erschlage. Das ist schonmal ein Fortschritt, dann kann mit dem Arbeiten aufhören und was sinnvolles machen. ZB eine Knobelei kugelsicher zu machen. Darin liegt doch, meiner Meinung nach, genau die Herausforderung.Hume: Ja danke, das hatte ich im Eifer des Gefechts doch glatt übersehen :). Soweit ich sehe, resultiert dieses Problem aber genau daraus, dass man nicht weiß, wie negative Werte bitgenau abgespeichert werden ...
-
andere frage:
kann man jede funktion von int auf int nur mit >>, <<, &, | und ~ ausdrücken?
edit: nehmen wir noch + und - dazu.Man kann boolsche Funktionen f: B^n -> B sogar nur mit & und ~, | und ~ (nach Boole eigentlich &, | und ~, aber da x & y = (x | ~y) und x | y = (x & ~y) gelten, reicht entweder & oder | aus) oder sogar nur ^ (Zhegalkin-Logik afaik) ausdrücken. Prinzipiell stellt die Erweiterung auf B^n -> B^m (also z.B. int auf int) einen nicht vor zusätzliche Schwierigkeiten, man muß nur zum Schluß die herausgekommenen Bits irgendwie zusammensammeln, also braucht man noch (im einfachsten Fall) den << Operator.
P.S. B := { 0, 1 }
P.P.S: In der Praxis muß man sich natürlich fragen, ob die Minimierung der Funktion zeitlich machbar ist, und ob der entstehende Ausdruck nicht etwas groß für den C++-Compiler wird.
-
in der praxis kann man mit standatd-c++ wohl kaum programm verkaufen. ohne farben? ohne maus? ohne sound?
und siehe da, es werden lösungen verlangt, die manchmal funktionieren.und wertebereiche? ja, schnell und komplett oder lahm mit einschränkung? du magst gerne nur komplette sachen machen. aber das ist dann spielerei, die keiner haben mag.
nee, was mich eigentlich nervt ist, daß man keine 5 zailen backen kann, ohne daß einer daherkommt und sagt "es gibt aber auf dem mond ne maschine, wo das nicht klappt". standard-c++ und das c++, das gesprochen wird, sind zwei unterschiedliche dinge. ich kann nix dafür, daß c++ so standardisierd wurde. aber ich nicht jeden furz mitmachen und postuliere: ein byte hat 8 bit und ints werden binär dargestellt wie auf intel-rechnern oder genauso aber mit anderer byte-reihenfolge und >>1 wirkt wie /2.
mir ist bewußt, daß ich damit meinen wirkungskreis auf 99.9% der rechner einschränke.
-
Original erstellt von Bashar:
man muß nur zum Schluß die herausgekommenen Bits irgendwie zusammensammeln, also braucht man noch (im einfachsten Fall) den << Operator.genau. dazu reicht ja + (der ausdruck wird evtl sehr lang). also geht jede funktion von int auf int ohne if und konsorten.
-
Ich fand Dimahs Lösung witzig anstatt 3 if die 3 while zu benutzen
-
int f(int i) { if(i < 0) { return -1; } if(i == 0) { return 0; } if(i > 0) { return 1; } }
-
int sign(int x) { int result; do { result = x; x /= 2; } while(x); return result; }
*grins*
-
@Bashar: geil
-
Ich hätte eine Idee....
ich habs noch nicht probiert - vielleicht gehts ja !int function(int x) { return (x<0)-(x>0); }
-
Blödsinn, mein fehler:
int function(int x) { return (x>0)-(x<0); }
-
Original erstellt von <--..-->:
**ich habs noch nicht probiert - vielleicht gehts ja !int function(int x) { return (x<0)-(x>0); }
**
die vorzeichen sind immer gefährlich.
aber gute idee. ich vermute, diese lösung schwebte dem author* im sinn.* wer findet den fehler?
-
wie wärs damit:
int func(int wert) { return ((bool(wert)-(bool(((char*)&wert)[0]&0x80 == 0x80))-bool(((char*)&wert)[0]&0x80 == 0x80))); }
Naja oder etwas hübscher so:
int func(int wert) { char* c_wert = (char*)&wert; bool minuszahl(c_wert[0]&0x80 == 0x80); bool nichtnull = bool(wert)-minuszahl; return (nichtnull-minuszahl); }