Umwandlung von Binärzahlen in Dezimalzahlen und andersrum!



  • Hy Leute, ich habe mal eine kurze Frage, wie kann ich die funktion pow() benutzen um Binärzahlen in Dezimalzahlen umzuwandeln und andersrum?
    Ich kann den Algorithmus mathematisch schreiben aber ich kann den nicht in c++ code umsetzen! Bitte um Hilfe dringend!
    danke im voraus!



  • Welchen Algorithmus hast du und wie sehen deine Versuche aus, diesen in C++ zu implementieren? BTW gabs das Thema schon einige Dutzend Male. Du könntest also die Suche benutzen.



  • int ConvertBinToDec(bool test[])
    {
        int ret = 0;
    
        for(int i = 0; i<(int(sizeof(test))); i++)
        {
            if(test[i] == true)
            {
                ret += pow(2,i);
           }
        }
        return ret;
    }
    


  • lekos danke sehr!! das meinte ich!
    danke, du hast mir sehr geholfen!!



  • lekos eine Frage noch, kann man das programm auch ohne bool schreiben?
    bool kenne ich noch nicht so gut



  • Du kannst das ganze natürlich auch mit einem int array machen.
    Bool macht für mich hier halt am meisten sinn da es nur die werte 0/1 annehmen kann und mehr braucht man in der binären schreibweise ja nicht.

    #include <iostream>
    #include <math.h>
    using namespace std;
    
    int ConvertBinToDec(bool bin[])
    {
        int ret = 0;
    
        for(int i = 0; i<int(sizeof(bin)); i++)
        {
            if(test[i] == true)
            {
                ret += pow(2,i);
           }
        }
        return ret;
    }
    
    int main()
    {
      bool bin[] = {1,1,1,0};
      cout<<ConvertBinToDec(bin);
    
      return 0;
    
    }
    

    hier hast du noch ein kleines beispiel zum compilen & rumpobieren wenns dir noch nicht ganz klar ist.



  • int ConvertBinToDec(bool bin[])
    

    ist äquivalent zu

    int ConvertBinToDec(bool* bin)
    

    sizeof(bin) ist auf 32 Bitsystemen daher immer 4.
    Außerdem wertest du es genau falsch herum aus. Du fängst beim msb an, addierst aber pow(2,i), wobei i beim msb 0 ist.

    @claudiu.m
    Du kannst ausnutzen, dass 2n = pow(2,n) = 1<<n. Das Letzte ist ein Linksshift und verschiebt die Bits einer (Integer-) Variablen um n Stellen nach links.

    So kannst du schreiben:

    size_t bintodec(const std::string& s)
    {
    	size_t len = s.length();
    	if(!len)
    		return 0;
    	size_t ret = 0;
    	for(int i=0;i<len-1;++i) // nur bis zur vorletzten Stelle
    	{
    		if(s[i]=='1') ret|=1;
    		ret<<=1;
    	}
    	if(s[len-1]=='1') ret|=1; // bei der letzten Stelle kein Shift
    	return ret;
    }
    
    std::string dectobin(size_t i)
    {
    	std::string s;
    	for(int k=sizeof(size_t)*8-1;k>=0;--k)
    		s+=((i>>k) & 1)?'1':'0'; // analog der Rechtsshift, nach rechts verschieben und prüfen, ob das lsb nach dem Shift gesetzt ist
    
    	return s;
    }
    int main()
    {
    	string s("1111");
    	cout << s << endl;
    	size_t k = bintodec(s);
    	cout << k << endl;
    	cout << dectobin(k) << endl;
    }
    

    Edit: MSB, LSB -> msb, lsb



  • Außerdem wertest du es genau falsch herum aus

    inwiefern falsch?
    das ergebnis stimmt wenn ich die funktion benütze.

    Bitte erleuchte mich.

    btw was meinst du mit msb?



  • @claudiu.m: In welcher Form liegt denn Deine Binärzahl vor, also in welchem Typ von Variable oder Array?

    Ansonsten solltest Du pow( ) hier gar nicht benutzen, denn dieses arbeitet mit Fließkommazahlen. Diese werden bei großen Zahlen ungenau und sind zudem zu langsam für Bitoperationen.

    Oder ist das pow( ) ein Teil Eurer Aufgabe?

    Für binär bzw. dezimal reichen die einfachen Bitoperationen wie z.B. im Programm von Vicious Falcon.



  • http://codepad.org/Ky70VtWU
    Die Zahl

    1011b = 11d
    Du wertest aus
    1  2[h]0[/h]
    0 +0
    1 +2[h]2[/h]
    1 +2[h]3[/h]
      ---
      13
    

    Richtig wäre aber die Auswertung in der Reihenfolge 1101, vom lsb zum msb (msb = most significant bit, lsb = least significant bit).
    Dass sizeof(bool*) konstant ist, hatte ich ja schon geschrieben.
    :xmas1:



  • oh jetzt seh ichs 🙂

    Naja kann man ja leicht ändern indem man die schleife rückwärts laufen lässt.
    Aber danke für den Hinweis.



  • hey leute, ich habe auch noch eine frag zu diesem Programm,ich muss auch so ein Programm schreiben, aber ich nin ziemlich new in C++ also, ich kann euren Quellcode nicht verstehen.
    es wäre genial wenn jemand sich die Zeit nehmen würde und mir erklären würde wie ich dieses Programm schreiben kann, aber mit while schleife und pow funktion, mehr nicht weil ich mehr nicht gelernt habe.
    danke im voraus!




Anmelden zum Antworten