Einer Binär-Zahl Nullen voranstellen [WIe?]



  • Hallo zusammen,

    ich habe eine Methode, in der ich einen Int in seinen Binär-Wert umrechne.
    Der Wert, der herauskommt ist ebenfalls ein Int.

    Also habe ich bspw. ganz klassisch danach 11011.

    Ich muss die Werte auf 10 Stellen erweitern, d.h. Nullen voranstellen.

    Bisher ist meine Idee, die Binär-Zahl in einen String umzuwandeln, die Länge zu bestimmen und entsprechend mit den fehlenden Nullen (ebenfalls String) zu einem neuen 10-stelligen String zu verketten.

    Das klingt nur so gar nicht elegant.

    Habt ihr vielleicht einen besseren Tipp für mich?

    Vielen Dank vorab.



  • Fischi2k schrieb:

    ich habe eine Methode, in der ich einen Int in seinen Binär-Wert umrechne.
    Der Wert, der herauskommt ist ebenfalls ein Int.

    Wtf? Die Repräsentation einer Zahl (also z.B. im Binärsystem) ist ein String und kein int! Und da kannst Du dann gemütlich vorne 0en ranhängen - oder direkt von der Umrechnung mit generieren lassen.



  • Fischi2k schrieb:

    ich habe eine Methode, in der ich einen Int in seinen Binär-Wert umrechne.
    Der Wert, der herauskommt ist ebenfalls ein Int.

    Das ist schon das Problem. Ein int liegt bereits in Binärdarstellung vor, man kann ihn nicht in Binärdarstellung umrechnen. Du willst von vornherein die Binärdarstellung des int als String, die Zwischendarstellung als int, dessen Dezimaldarstellung aussieht wie die ursprüngliche Binärdarstellung, ist ein Holzweg.

    BTW, warum eigentlich 10 Stellen? Ein int hat mindestens 15 Nichtvorzeichenbits.



  • Ich habe für eine Textkomprimierung eine LZW-Komprimierung programmiert.

    Die Teile des Tests werden in ihrer komprimierten Form durch Werte von 0 - 1023 dargestellt.

    Diese Werte sollen nun binär (10-stellig) dargestellt werden, sprich:

    Sei der Code für das erste Muster des Textes bspw. die 119, so soll dieser Eintrag zu folgendem umgewandelt werden:

    Dezimal: 119
    Binär: 1110111
    10-stellig: 0001110111

    Meine Testmethode, um eine Dezimalzahl als Binär darzustellen, sieht folgendermaßen aus:

    #include <iostream>
    
    using namespace std;
    
    void main() {
    
    int zahl, dezimal, rest, ergebnis=0, faktor=1;
    
    	cout << "***** DEZIMAL ==> BINAER *****" << endl;;
    	cout << "Bitte geben sie die Zahl ein, die ins binaere Zahlensystem konvertiert werden soll : " << endl;
    	cin >> dezimal;
    
    	zahl=dezimal;
    
    	while (dezimal)
    		{
    		rest = dezimal % 2;
    		dezimal = dezimal / 2;
    		ergebnis = ergebnis + rest * faktor;		
            faktor *= 10;
    
    		}		
    
    	cout << zahl << " als binaere Zahl: " << ergebnis << endl;
    
    	getchar();
    	getchar();
    
    }
    

    Diese dient derzeit zu Testzwecken.
    Bin ich denn damit auf dem richtigen Weg?

    Mein Problem derzeit ist, dass ich nicht weiß, wie ich dem "ergebnis" die entsprechenden Nullen voranstelle, um auf die 10 Stellen zu kommen.

    Durch das "WTF" in der ersten Antwort komme ich mir schon recht dämlich vor, also seid gnädig. 🙂



  • Du hast die Antworten vollständig ignoriert 😕



  • Ja, scheinbar habe ich das.

    Vielleicht lag es auch daran, dass ich aus den Antworten nicht ganz schlau wurde.
    Man möge mir verzeihen.

    Thema kann als erledigt angesehen werden.

    Vielen Dank.


  • Mod

    Fischi2k schrieb:

    Vielleicht lag es auch daran, dass ich aus den Antworten nicht ganz schlau wurde.

    Du machst den Fehler, Wert und Repraesentation einer Zahl gleichzusetzen. Der Wert einer Zahl ist, nun ja, die Idee hinter der Zahl. Der Wert der Zahl 3 ist zum Beispiel, die Eigenart, die den folgenden Gebilden gemeinsam ist*:

    III      7      %%     W     T T
             7      %     WW      T
             7
    

    Der Wert der Zahl 3 ist nicht '3', im Sinne von

    ######
        ##
        ##
    ######
        ##
        ##
    ######
    

    Das ist das Zeichen fuer die Ziffer 3 in unserem Zeichensystem und in unserem Stellenwertsystem auch gleichzeitig die Repraesentation der Zahl 3. Aber es gibt viele Repaesentationen. Roemisch "III", binaer: "11", Morsecode: "...--". Das sind alles Zeichenketten (manche nur ein Zeichen lang, aber das ist egal).

    Im Computer wird der Wert einer Zahl gespeichert, wenn du einen Datentyp fuer Zahlen benutzt (wie int). Wenn du nun aus dem Zahlenwert der Zahl 3 einen neuen int mit dem Wert 11 berechnest, dann ist das nicht die Darstellung der 3 im Binaersystem, sondern ein neuer Wert. Die Zahl "Elf", "XI", "1011", ".----.----" oder wie immer du sie darstellen willst. Durch deine Konstruktion ist die Darstellung der Zahl 11 im Zehnerstellenwertsystem gerade identisch mit der Darstellung der Zahl 3 im Binaersystem. Du hast aber nirgends diese Darstellung errechnet, das hat die Ausgabefunktion gemacht, als du ihr den Zahlenwert 11 gegeben hast und gesagt hast, dass dieser Wert im Zehnersystem ausgegeben werden soll (dadurch, dass du nichts anderes gesagt hast, ist Zehnersystem das Standardformat). Haettest du cout << hex << ergebnis geschrieben, waere stattdessen "B" ausgegeben worden (11 im Hexadezimalsystem). Das zeigt dir, dass du Werte und Darstellung in deiner Logik nicht richtig getrennt hast.

    *: Irgendein Klugscheisser wird jetzt "schwarz auf weiss" oder "ASCII-Zeichen" als Gemeinsamkeit benennen 😉



  • Wenn es darum geht, die Zahl binär auszugeben, ist die einfachste Methode ein Bitset:

    #include <bitset>
    #include <iostream>
    
    int main() {
      std::bitset<10> b(1234);
    
      std::cout << b << std::endl;
    }
    

    Siehe http://en.cppreference.com/w/cpp/utility/bitset



  • Vielen vielen Dank euch beiden. Die letzten beiden Antworten werden mir in Zukunft sicher sehr nützlich sein.



  • Kann ich auch noch einen Vorschlag machen? Wenn du was nicht verstehst, nachfragen.



  • Ich wäre der letzte,der dir verbietet mir mehr Input zu liefern. 🙂
    Also bitte...

    Wollte schon schreiben, dass ich eine weitere Frage gestellt habe und mich dort über Antworten freuen würde. Aber Du hast ja bereits etwas dazu geschrieben. 🙂 Danke dafür.

    Außerdem: Entschuldigt einfach dumme Fragen, aber wir wurden hier in der Uni in C++ echt ins kalte Wasser geworfen. Die Vorlesung handelt nur von dem mathematischen/physikalischen Hintergrund von Komprimierung. Alles an C++ muss im Selbststudium erlernt werden.



  • Aber den Wert eines Ints oder sonst was und dessen Darstellung als Dezimal, Hex, Oktal, Binaer, Striche, whatever hat doch nichts mit C++ zu tun, sondern ist Informatik allgemein. Und was ist an einer deterministischen Komprimierung physikalisch?



  • Fischi2k schrieb:

    Ich wäre der letzte,der dir verbietet mir mehr Input zu liefern. 🙂

    Es geht nicht ums Verbieten, das kannst du sowieso nicht, sondern ums Feedback. Ich fühl mich meistens ein bisschen veräppelt, wenn ich eine Antwort gebe und der Fragesteller so tut, als wär die gar nicht da.

    Außerdem: Entschuldigt einfach dumme Fragen, aber wir wurden hier in der Uni in C++ echt ins kalte Wasser geworfen. Die Vorlesung handelt nur von dem mathematischen/physikalischen Hintergrund von Komprimierung. Alles an C++ muss im Selbststudium erlernt werden.

    Freu dich. Selbststudium ist die einzig vernünftige Art, C++ zu lernen. Und an das mit dem kalten Wasser solltest du dich an der Uni langsam gewóhnt haben 🙂



  • Ich habe bis jetzt auch ALLES im Selbststudium gelernt und für mich war und ist es völlig normal mir selbst Wissen anzueignen und das dann auch einzusetzen, da ich weder eine Ausbildung noch ein Studium in diesem Bereich absolviert habe, nicht mal ein Abi habe ich in der Tasche. Dies ist aber kein Grund nicht zu wissen, wie man durch einen Baum traversiert oder wie man einen endlichen Automaten einsetzt. Das ist ja alles Wissen was man nachlesen kann, da brauch es keinerlei Ausbildung zu, sondern Interesse. Assembler und die Unterschied zwischen Adresse, Befehl und Daten und warum auch alles mal Daten sein können etc. habe ich im Alter von dreizehn begriffen und das war locker 15 Jahre vor dem Internet.

    Von einem Studenten der Informatik erwarte ich natürlich dreimal mehr Leistung, als von jemanden wie mir, der sich 100% selbst durchgebissen hat. In der Praxis sieht es dann leider so aus, dass es ein paar richtig gute Informatiker gibt, aber es gibt auch jede Menge Leute mit Schein, wo man nur mit dem Kopf schüttelt und sich fragt wie der, mit so wenig Hirn und Pragmatismus, durch den Beruf kommen soll. Wenn dir also ein Informatiker an die Seite gestellt wird, dann weißt du nicht ob das gut oder schlecht für das Projekt ist.



  • Wow, das wird mir tatsächlich zu blöd jetzt.

    Ich habe sicher einige Fragen SEHR SEHR unglücklich formuliert und gestellt. Gar keine Frage. Meine Fragen wurden beantwortet, dafür an alle "Danke".

    Aber eine derartige Selbstbeweihräucherung und das Kritisieren der ach-so-ungerechten Gesellschaft ist dann doch sehr am Thema vorbei.


  • Mod

    Fischi2k schrieb:

    Wow, das wird mir tatsächlich zu blöd jetzt.

    Nimm's nicht so schwer. Das ist das Internet. Besonders in Foren wie hier, wo wir auch unregistrierten Nutzern das Schreiben von Beitraegen erlauben, kommt auch mal ein Troll vorbei. Wenn ich so einen Sinnlosbeitrag frueher gesehen haette, haette ich ihn wahrscheinlich auch geloescht. Jetzt lasse ich ihn mal stehen, damit die Folgediskussion Sinn macht. Tipp: Einfach ignorieren. Faellt anfangs schwer, besonders wenn er einen direkt angreift, ist aber entspannend.


Log in to reply