Verständnisproblem Binärzahlumrechnung



  • Hallo!

    Folgendes Problem in c++:
    Ich habe ein Programm zur Umrechnung von einer ganzen Zahl in eine Binärzahl, nun versteh ich aber nicht genau was die einzelnen Schritte innerhalb der while-schleife sind, also was nach und nach "dort!" gemacht wird...
    Vielleicht kann mir da ja mal jemand helfen und das ganze verständlich erklären?

    -->
    void main(){
    int a;
    int i = 0;
    int int_bit_size = sizeof(int) * 8;

    cout<<"Geben sie eine ganze Zahl ein: "<<endl;
    cin>>a;

    while(i < int_bit_size){
    cout<<("%d",(a & 0x80000000) >> 31);
    a <<= 1;
    i++;
    }
    cout<<("\n");
    }

    Ich weiß, ist nicht wirklich anspruchsvoll, bin aber noch in den Anfängen der Marterie und freu mich auf die Glühbirne überm Schädel 💡 🙂

    Gruß
    Rick



  • Der Code ist nen bisschen komisch und auch nicht wirklich portabel, aber seis drum:

    while(i < int_bit_size)
    { 
        cout<<("%d",(a & 0x80000000) >> 31); 
        a <<= 1; 
        i++; 
    }
    

    Das "%d" könnte man auch einfach weglassen, das hat keinen Effekt, keine Ahnung, wieso es da steht...

    mit

    (a & 0x80000000)
    

    erhält man entweder 2^31 oder 0 als Lösung, je nachdem, ob das oberste Bit des Ints gesetzt war (funktioniert aber nur auf 32-Bit Systemen) 0x80000000 ist nämlich 2^31 = 2147483648.

    Man hat also entweder

    10000000000000000000000000000000

    oder

    00000000000000000000000000000000

    jenachdem, ob das oberste Bit gesetzt war.

    Das & ist ein binäres Und. Durch das Verschieben um 31 nach links erhält man dann eine 1 oder eine 0, die dann auch ausgegeben wird.

    In der zweiten Zeile

    a <<= 1;
    

    wird das gesamte Bitmuster in a eins nach links verschoben, d.h. alle Bits werden um eins verschoben. Beispiel

    00100001 -> 01000010

    In Wirklichkeit sind es natürlich mehr als nur 8 Bits.

    Ich hoffe, ich konnte helfen

    Felix

    P.S.: int main() und nicht void main()



  • [cpp]
    int main()
    {
    int a;
    int i = 0;
    int int_bit_size = sizeof(int) * 8;

    cout<<"Geben sie eine ganze Zahl ein: "<<endl;
    cin>>a;

    while(i < int_bit_size)
    {
    cout<<((a & 0x80000000) >> 31); // 0x80000000 = 10000000000000000000000000000000 binär
    //Das höchste Bit ist gesetzt und wird jeweils mit dem höchsten Bit von a UND verknüpt.
    //Das Ergebnis ist 1, wenn das Bit in a auch 1 ist, andernfalls 0
    - //Damit auch 1 bzw. 0 ausgegeben werden kann, wird dieses Bit zum Schluss 31 Stellen nach rechts geschoben.
    a <<= 1; // Die Bits in a werden in 1-er Schritten 31 mal nach links geschoben.
    i++;
    }
    cout<<("\n");
    }



  • derRick schrieb:

    Ich habe ein Programm zur Umrechnung von einer ganzen Zahl in eine Binärzahl

    ... hier ist bereits Dein Verständnisproblem! Was ist denn der Unterschied zwischen einer ganzen Zahl und einer Binärzahl?

    Was Du willst, ist nicht eine Umrechnung sondern eine Darstellung. Die Zahl bleibt dieselbe, alles was sich ändert, wenn Du eine Zahl binär, dezimal, oktal ... hast, ist deren Darstellungsart, nämlich die Anzahl verschiedener Ziffern, die eine Stelle der Zahl einnehmen kann, also die Basis der Zahl.

    Intern im Computer sind Zahlen als Binärzahlen dargestellt. Dein Problem ist lediglich, wie Du auf die einzelnen Bits einer Zahl zugreifst bzw. diese darstellst.



  • Das ist extrem kompliziert gelöst.

    Eine Variante für alle integralen Typen:

    template< typename integralType >
    std::string toBinary( integralType num )
    {
    	std::stringstream bin;
    	for( size_t it = 1 << std::numeric_limits< integralType >::digits; it > 0; it >>= 1 )
    		bin << bool( num & it );
    	return bin.str();
    }
    
    int main()
    {
       std::cout << toBinary< char >( 16 );
    }
    

    Disclaimer: bin mir nicht hunderprozentig sicher ob std::numeric_limits::digits immer die Anzahl an Bits für einen integralen Typ liefert, falls nicht einfach das Define CHAR_BIT * sizeof( integralType ) dafür verwenden.



  • in dem board hier fehlt eindeutig ein faq-artikel: 1001 tricks wie man eine binärzahl bastelt 😉



  • net schrieb:

    in dem board hier fehlt eindeutig ein faq-artikel: 1001 tricks wie man eine binärzahl bastelt 😉

    Was stimmt mit dem vorhandenen FAQ-Artikel nicht?



  • HumeSikkins schrieb:

    net schrieb:

    in dem board hier fehlt eindeutig ein faq-artikel: 1001 tricks wie man eine binärzahl bastelt 😉

    Was stimmt mit dem vorhandenen FAQ-Artikel nicht?

    oh, habt ihr schon einen?
    hätt' ich nicht gedacht, weil diese frage so unglaublich oft kommt.
    sorry, ich hab' da lange nicht reingeschaut...



  • net schrieb:

    HumeSikkins schrieb:

    net schrieb:

    in dem board hier fehlt eindeutig ein faq-artikel: 1001 tricks wie man eine binärzahl bastelt 😉

    Was stimmt mit dem vorhandenen FAQ-Artikel nicht?

    oh, habt ihr schon einen?
    sorry, ich hab' da lange nicht reingeschaut...

    Marc++us hat vor kurzem (September 2001 🙄 ) mal was geschrieben:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39490.html

    😉



  • Danke Phoemuex und schieber ⚠
    Es ist nun eindeutig klarer geworden! 👍

    An den Rest, ich weiß was eine Binärzahl ist und auch wie man eine ganze Zahl zu einer Binärzahl umrechnet, es ging allein um dieses Programm, bzw. spezifisch um das ganze innerhalb der while-schleife 😉 Aber das steht da ja auch 😃

    Man kann es mit sicherheit auch einfacher lösen, dies war aber eine Aufgabe und die sollte man mit bestimmten Mitteln lösen.

    Danke und Gruß.
    Rick


Anmelden zum Antworten