Binär???
-
Allerdings dürfte sie bei zu hohen int zahlen undefiniertes verhalten zeigen
Ein int ist nunmal größer als 8 Bit. Macht so also nicht viel Sinn. Taurins Variante mit string ist da ohnehin hübscher.
Und in der FAQ stehts auch nochmal.
-
oder so:
int main() { int zahl=4; char bin[]="00000000"; for(int i=0;i<8;i++){if (zahl&1) bin[7-i]++;zahl>>=1;} cout << bin; return 0; }
-
Tschuldigung für die komische for
for(int i=7;i>=0;i--){if (zahl&1) bin[i]++;zahl>>=1;}
-
DrGreenthumb schrieb:
Allerdings dürfte sie bei zu hohen int zahlen undefiniertes verhalten zeigen
Ein int ist nunmal größer als 8 Bit. Macht so also nicht viel Sinn. Taurins Variante mit string ist da ohnehin hübscher.
Und in der FAQ stehts auch nochmal.
Das hat mit der maximalen Zahlengröße einer int rein garnichts zutun!
Die Funktion ist eben auf ASCII werte konzipiert gewesen und da reichen 8bitDu kannst sie aber gern umschreiben (einfach die anzahl der Forschleifendurchläufe erhöhen und entsprechend mehr speicher reservieren und schon hast du s passend!) :p :p :p
schön ist relativ
-
schön ist relativ
Wenn man etwas komplizierter macht als es sein kann, ist es weniger schön. Nix relativ.
-
Ich finde, es ist ganz davon abhängig, wofür man die Funktion (bzw. die binäre Zahl) braucht. Will man sie nur ausgeben, ist es sicherlich einfacher sie in einem String zu speichern. Wenn man die Zahl aber z. B. als Flag einsetzt, dann kann man mit einem Bool-Array sicherlich besser arbeiten...
-
bool *ItoB(int Zeichen) { int anzbits=0,pot=1;// pot kann man auch mit pow machen ... while(Zeichen/pot>0) {anzbits++;pot*=2;}//Anzahl der bits feststellen bool *bin=new bool[anzbits]; for(int i=0;i<anzbits;i++){bin[anzbits-1-i]=Zeichen&1;Zeichen>>=1;} return bin; }
-
Und hier noch die Quelle für all die Lösungen:
http://c-plusplus.net/forum/viewtopic.php?t=42933-junix
-
Kann ich schweigen angesichts der Tatsache, daß schon wieder jemand POW benutzt, um Bits zu ermitteln?
Immer das gleiche: mit dem 4,8 Tonner zum Getränkeladen fahren, um zwei Kästen Coke zu holen...
-
Auch wenn das hier ein C++ forum ist sollte man einfache Lösungen nicht vergessen
char buffer[8+1]; int i; _itoa( (i % 256), buffer, 2 );
i zu konvertierender Wert
buffer Stringbuffer ausreichend groß
2 Basis zu der der Wert gebildet werden sollString of integer 117 (radix 2): 01110101
Siehe VC 6.0 hilfe mit itoa
-
Hab auch schon danach gesucht, aber nicht mehr gefunden.
Meine ursprüngliche Variante entsprach der von The_Freak, bis ich mich belehren lassen musste, das Bitrotation viel schöner ist.
Hab nur für mich nach ner Lösung gesucht alle Integerzahlen Binär darzustellen.
-
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