Binär???
-
Den kannte ich noch nicht.
-
@_stefan
Wen PAD oder itoa? :p
-
<wollte eigentlich was sagen und es dann wieder löschen; löschen geht aber nicht!?>
-
Durch die Modulo Operation wird der wert auf den Bereich von 0x00 bis 0xff eingeschränkt.
Eine sinvolle und wahrscheinlich schnellere, somit bessere Alternative ist
i=i&0xff;
-
Ein guter Compiler wird in beiden Fällen identischen Code erzeugen.
-
Dazu ist zu sagen, dass itoa nicht portabel ist. Also vorsicht!
Zum Thema itoa gibts übrigens auch einige Kommentare in dem von mir geposteten thread.-junix
-
Ich habe mal folgenden Code geschrieben, aber leider klappt bisher die &-Operation nicht, und ich weiß beim besten Willen nicht wieso.
#include <iostream.h> #include <string> #include <math.h> using namespace std; string DezToBin(int Dez); int main() { char Again; int Dez; string Bin; do{ cout << "Geben sie die gewuenschte Dezimalzahl ein:"<<endl; cin >> Dez; Bin = DezToBin(Dez); cout << "Die gesuchte Binaerfolge lautet: " << Bin.c_str() << endl; cout << "Weitere Zahl? (Y/N)"<<endl; cin >> Again; }while(Again == 'Y' || Again == 'y'); return 0; } string DezToBin(int Dez) { string Bin; if (Dez > 0){ int Elements = log10(Dez)/log10(2); for(int i=Elements;i>=0;i--){ if (Dez & (2^i)==0) Bin += "0"; else Bin += "1"; } }else Bin = "0"; return Bin; }
Vielleicht kann mich ja jemand hier verbessern?
Danke im Voraus,
Flux
-
2^i bedeutet nicht 2 hoch i... '^' ist der bitweise Not-Operator.
Schau dir die anderen Beiträge nochmal an. Normalerweise macht man das mittels shiften.Dez & (1<<i)
-
Ah, genau, stimmt ja, das Problem hat ich schon mal...
Vielen Dank!!
So, jetzt geht die Funktion:
string DezToBin(int Dez) { string Bin; if (Dez > 0){ int Elements = log10(Dez)/log10(2); for(int i=Elements;i>=0;i--){ if ((Dez & int(pow(2,i)))==0) Bin += "0"; else Bin += "1"; } }else Bin = "0"; return Bin; }
Grüße,
Flux
-
..und einmal mehr die Frage: Wozu pow?!?
Da ist ja die unleserliche Multiplikation mit 2 noch effektiver als pow... Was hast du nur gegen die Bitschieberei? Nur weils ObjektOrientiert ist, braucht man noch lange nicht die Hände möglichst von binären Dingen zu lassen...-junix
-
Ok, ist klar, du hast Recht. Habs jetzt mal so gemacht:
string DezToBin(int Dez) { string Bin; if (Dez > 0){ int Elements = log10(Dez)/log10(2); int pot=pow(2,Elements); for(int i=Elements;i>=0;i--){ if ((Dez & pot)==0) Bin += "0"; else Bin += "1"; pot>>=1; } }else Bin = "0"; return Bin; }
Ist das eine Pow am Anfang ok? Ich weiß, man könnte die pot Variable zu Beginn auch auf 0 setzen und dann die schleife von 0 zu Elements durchlaufen, aber irgendwie hat das dann nicht mit dem Bin.append hingehauen.
Grüße,
Flux
-
/* verlesen */
-
Kommentierste das oben mal bitte? Irgendwie werd ich nicht ganz schlau aus deinem geschreibsel (mag auch an der unmöglichen Formatierung liegen). Was willst du nur immer mit deinem pow? Um sowas zusammenzuschneidern brauch ich kein einziges mal eine Potenz von irgendwas?!?
-junix
-
Jap, sorry, hab mich wirklich etwas schlampig ausgedrückt. Wie auch immer, das Problem mit dem string hab ich jetzt nicht mehr, und das ganze ist jetzt ohne jedes Pow gelöst:
string DezToBin(long Dez) { string Bin; if (Dez > 0){ int Elements = log10(Dez)/log10(2); long pot=1; for(int i=0;i<=Elements;i++){ if ((Dez & pot)==0) Bin.insert (0, "0"); else Bin.insert (0, "1"); pot<<=1; } }else Bin = "0"; return Bin; }
Grüße,
Flux
-
Fluxx schrieb:
Ist das eine Pow am Anfang ok?
nee
string dez2bin(int x) {//ungetestet char buf[32]; char* p=buf+32; do *--p='0'+x%2; while(x/=2); return string(p,buf+32-p); }
-
iiih... volkard sieht ja hässlich aus die Konstruktion (o:
Wieso nicht einfach sowas:
string dez2bin(int x) {//ungetestet string bin_str(""); bin_str.reserver(32); // war das der Aufruf? 32 Byte schonmal vor allokieren int mask_int = 0x01; // Bitmaske do { bin_str += (x & mask_int) ? '1' : '0'; mask_int <<= 1; // Maske um eins verschieben } while (mask_int); return bin_str; }
Wennde den ? Operator noch durch einfreundliches if ersetzt kanns sogar jeder lesen und ist doch irgendwie übersichtlicher?
-junix
-
junix schrieb:
iiih... volkard sieht ja hässlich aus die Konstruktion (o:
sowas kleines mach ich eher auf performance. einfach wirds dabei von alleine. zum beispiel, daß die if-while-kostruktion durch ne do-schleife ersetzt werden konnte.
und die vielen += auf strings sind gar nicht so klasse. das ?: wird zu nem sprung und der ist teuer. statt >>= verwende ich leiber /=, denn der optimierende compiler kann /= zu >>= selber machen. und beim ?: (was ich nich verwende) würd ich noch schnell schauen, obs nicht nach = erst drankommt.
-
volkard schrieb:
und die vielen += auf strings sind gar nicht so klasse.
Dank dem Vorreservieren wirds nicht halbso teuer wie wenndu das bei nicht vorreserviertem Speicher machst... (ist noch bei vielen Containern der STL so). Im Gegenteil. Es kann sogar massiv schneller sein, den Bedarf an Bytes zunächst zu errechnen und dann gezielt zu reservierst, als immer mal wieder auf die allocator des Containers zu warten. (Solange du dich nicht innerhalb eines Blocks bewegt welcher der Allocator sowieso reserviert). Zugegeben, ist nicht unbedingt schneller als dein Byte-Array
volkard schrieb:
das ?: wird zu nem sprung und der ist teuer.
Kannst du recht haben, weiss ich nicht genau... Müsste ich mal nachprüfen wieviel teurer mich das zu stehen kommt.
volkard schrieb:
statt >>= verwende ich leiber /=, denn der optimierende compiler kann /= zu >>= selber machen.
Nur, dass >>= mehr dokumentiert als ein /= ... kommt aufs Selbe wie wenn einer statt ein <<= 3 zu machen einfach nen 2 * 2 * 2 macht (und nicht mal 8 rechnet, damit er selbst dokumentiert hat wieviele bits er schiebt)... liest sich wie sau und auf den ersten Blick ist nicht ersichtlich was er da eigentlich will. (wahrscheinlich gewöhnungssache)
volkard schrieb:
und beim ?: (was ich nich verwende) würd ich noch schnell schauen, obs nicht nach = erst drankommt.
Nein hier weiss ich, dass ?: höhere Priorität hat...
Ausserdem... was wollte er sonst zuweisen, wenn er nicht den Ausdruck auswertet?-junix
-
btw. Deine Funktion hat nen hässlichen Fehler: Der Nullabschluss fehlt... (o;
-junix
-
junix schrieb:
volkard schrieb:
statt >>= verwende ich leiber /=, denn der optimierende compiler kann /= zu >>= selber machen.
Nur, dass >>= mehr dokumentiert als ein /= ... kommt aufs Selbe wie wenn einer statt ein <<= 3 zu machen einfach nen 2 * 2 * 2 macht (und nicht mal 8 rechnet, damit er selbst dokumentiert hat wieviele bits er schiebt)... liest sich wie sau und auf den ersten Blick ist nicht ersichtlich was er da eigentlich will. (wahrscheinlich gewöhnungssache)
du spielst mit bits und ich mit zahlen.
aus der version für binärzahlenstring dez2bin(int x) {//ungetestet char buf[32]; char* p=buf+32; do *--p='0'+x%2; while(x/=2); return string(p,buf+32-p); }
wird leicht eine für zahlen oktalsystem
string dez2bin(int x) {//ungetestet char buf[32]; char* p=buf+32; do *--p='0'+x%8; while(x/=8); return string(p,buf+32-p); }
indem ich an zwei stellen statt 2 jetzt 8 schreibe. hab also eigentlich den beliebigen zahlenumwandler gebaut (auch deshalb + statt ?:) und der klappt halt auch für 2 und ist schnell.