DEZ -> BIN (QA)



  • Digger182 schrieb:

    Ich glaube zu meinen, dass wenn du den vector ausgibst er true bzw. false ausgeben wird da du ja bool verwendest aber ich bin mir nicht sicher => noch nie probiert.

    Du glaubst falsch:

    static_cast< int >( true );  // 1
    static_cast< int >( false ); // 0
    

    Digger182 schrieb:

    Warum probierst dus nicht einfach aus?

    Dass das Programm läuft und das tut was es soll weiß ich. Darum geht's mir nicht 😉 . Eleganz ist gefragt...

    Digger182 schrieb:

    [Edit]Sonst seh ich aber keine Fehler[/Edit]

    Wär auch schlimm 🙄

    Digger182 schrieb:

    [Edit2]Musst dus unbedingt einen Vector verwenden geht nämlich auch viiiel einfacher, kann dir den Code gaben wenn du willst[/Edit2]

    Ich brauch ihn zwar nicht, aber los: Hosen runter!

    rüdiger schrieb:

    Du könntest direkt std::bitset nehmen 🙂

    aja, stimmt:

    #include <bitset>
    #include <iostream>
    
    using namespace std;
    
    int main( ) {
    
    	unsigned int zahl = 0;
    
    	do {
    		cout << "Bitte geben Sie eine Zahl ein:" << endl;
    
    		cin.clear( );
    		cin.ignore( cin.rdbuf( )->in_avail( ) );
    		cin >> zahl;
    
    		if( cin.fail( ) || ( cin.rdbuf( )->in_avail( ) > 1 ) ) {
    
    			cout << "Fehler: Bitte geben Sie eine Zahl ein!\n" << endl;
    			zahl = ~0U;
    
    		} else if( zahl > 0xff ) {
    
    			cout << "Fehler: Die eingegebene Zahl darf nicht größer sein als 255!\n" << endl;
    		}
    
    	} while( zahl > 0xff );
    
    	cout << bitset< 4 >( ( zahl & 0xf0 ) >> 4 ) << " " << bitset< 4 >( zahl & 0x0f ) << endl;
    }
    

    rüdiger schrieb:

    das ist undefiniertes Verhalten afaik

    aja? Wär schlimm. Aber ~0U is eh schöner 😉

    Digger182 schrieb:

    Warum machst du das überhaupt nimm doch gleich signed int

    no comment.

    Digger182 schrieb:

    Das verwirrt mich nur noch mehr, könntest du bitte etwas dazu sagen?

    ja. [edit] toooooo late 😉 [/edit]

    Angenommen, ein unsigned int ist 4 byte breit, dann ist

    0U = 0000 0000 0000 0000 0000 0000 0000 0000
    

    und

    ~0U = 1111 1111 1111 1111 1111 1111 1111 1111
    

    greetz, Swordfish



  • habs schon verstanden dachte die 0 ist ein o und das mit den u... naja
    das mit dem ~ operator hab ich schon gewusst



  • Swordfish schrieb:

    rüdiger schrieb:

    das ist undefiniertes Verhalten afaik

    aja? Wär schlimm. Aber ~0U is eh schöner 😉

    Der Standard garantiert kein Two's Complement. Deswegen. Welche Darstellungen standardkonform wären, ist schon schwieriger zu sagen. 😃



  • Evtl.

    std::numeric_limits<unsigned int>::max()
    

    😕 😃



  • LordJaxom schrieb:

    Evtl.

    std::numeric_limits<unsigned int>::max()
    

    😕 😃

    😡

    greetz, Swordfish 😉

    [Wo ist der Smily, der sich den Schädel mit einem Hammer... ähm... massiert?]



  • Hallo,
    ich habe versucht es so zu lösen:

    unsigned int m, z = 1200;
    m=1+(numeric_limits<unsigned int>::max() >> 1);
    cout << "m : " << m << "  z: " << z << " = ";
    while ( m > 0) {z & m ? cout << 1 : cout << 0; m >>=1;}
    // m : 2147483648  z: 1200 = 00000000000000000000010010110000
    

    und es scheint ja auch (zum Teil) zu funktionieren. Die größte unsigned int ist aber 2 * 2147483648.
    Wenn ich die benutze als Maske, kommt 0 raus. Deshalb zuerst der rechts-shift und anschließend + 1.
    Woran kann es liegen, dass max() von unsigned int nicht funktioniert? Alle Rechen- und Shift-Operationen
    müssten doch ohne Berücksichtigung des Vorzeichens durchgeführt werden?

    vg tesu



  • Swordfish schrieb:

    Hab ich irgendwas übersehen? (QA 😉 )

    übersehen? 😕
    umständlicher geht's wohl kaum.
    ...und wieso nur bis 255?



  • tesuji schrieb:

    Alle Rechen- und Shift-Operationen müssten doch ohne Berücksichtigung des Vorzeichens durchgeführt werden?

    Warum sollte die Berücksichtigung eines Vorzeichens bei unsigned Werten eine Rolle spielen!?

    greetz, Swordfish

    PS @pale dog: Hab Nachhilfe über Zahlensysteme gegeben und als Beispiel die Umrechnung von Dezimal in Binär, so wie man sie per Hand vornehmen würde, gebracht. Schülerin hats geschnallt. Die Version mit Bitoperationen ist morgen erst dran 😉



  • Swordfish schrieb:

    PS @pale dog: Hab Nachhilfe über Zahlensysteme gegeben und als Beispiel die Umrechnung von Dezimal in Binär, so wie man sie per Hand vornehmen würde, gebracht. Schülerin hats geschnallt. Die Version mit Bitoperationen ist morgen erst dran 😉

    das wiederholte teilen durch die basis ist ja kein ding. so kann man ja beliebige zahlensysteme umwandeln.
    meiner meinung nach ist zu viel ballast dabei.
    das sieht mehr nach 'wie funktioniert ein stack' aus.
    🙂



  • Guten Morgen,

    Hier wie versprochen mein Code(Ist zwar seeeehr einfach aber er tut was er tun soll):

    void dez_in_bin()
    {
    	int dezimal;
    	int binar[8];
    
        cout << "Umrechnung Dezimal => Binaer" << endl;
    	cout << "Geben sie eine Zahl zw. 0 und 255 ein: ";
    	cin >> dezimal;
    	cout << endl;
    
    	for (int i = 7; i >= 0; dezimal /= 2, i--)
    	{
    
    		binar[i] = dezimal % 2;
    
    	}
    
    	cout << "Ihre Zahl im Binaersystem:" << endl;
    
    	for(int i = 0; i < 8; i++)
    	{
    		cout << binar[i];
    	}
    
    	cout << endl;
    }
    

    Ich sollte hier noch erwähnen das es nur eine Funktion ist wie ihr sicher gemerkt habt wie ihr sie anwendet muss ich wohl nicht erklären 😃



  • hi,
    @swordfish. ich hatte einen Denkfehler gemacht und das (falsche) Ergebnis dann auf die unsigned shift-operationen geschoben. Ich hatte angenommen, dass die größte 32 bit unsigned 2^32 sei, falsch, die ist ja in 32 bit nicht mehr darstellbar. Es ist 2^32-1 und das ist eine ungerade zahl mit lauter einsen, also für eine maske, die das MSB maskieren soll, nicht geeignet. richtig lautet die Maske, so wie ich es im code-schnipsel berechnet habe:

    m = 1+(numeric_limits<unsigned int>::max() >> 1)

    oder wenn man konstant 32 bit länge zugrunde legt:

    m = 1 << 31

    Nachhilfeschülerin: das ist aber lustig, ich gebe ja auch mathe nachhilfe und vor ein paar wochen habe ich auch dasselbe Problem, einigen Schülern zu erklären wie man zwischen verschiedenen Basissystemen umrechnet und in ihnen rechnet. Hier in Bayern verlangt man, dass die Schüler im Fünfersystem rechnen können, also war unser Konvertierungsschwerpunkt 10er <--> 5er.

    Zu deinem Programm: Meinst du nicht auch, dass es selbst für Schüler vom Gymnasium doch noch etwas zu schwierig ist (auch wenn die Schüler an einer Informatik AG teilnehmen)?

    vg tesu



  • tesuji schrieb:

    m = 1+(numeric_limits<unsigned int>::max() >> 1)

    oder wenn man konstant 32 bit länge zugrunde legt:

    m = 1 << 31

    Warum so umständlich?

    ~((~0U)>>1U)
    

    😃



  • hi Tim,
    deine maske ist ja viel schöner, danke.
    lg tesu


Anmelden zum Antworten