Rechtsshiftproblem



  • Hi Leute!

    Ich hab ein Problem mit dem Rechtsshift:

    Ich will die 1 dieser binären Zahl 10000000 um 8 Stellen an die erste Stelle der binären Zahl, also 00000001, verschieben.

    Mein Code sieht so aus:

    testchar = 128;
    testchar = (1 >> 8);
    

    Nur steht nach dem verschieben in testchar einfach 00000000. Warum? Könnt ihr mir helfen mein Problem zu lösen?



  • Weil der Shift um 8 Stellen eben 0 liefert.

    128 = 2^7. Ein Shift um 8 Stellen ist das selbe wie die Division durch 2^8:

    128 / 256 ist eben 0.

    Verschieb doch mal per Hand um 8 Stellen. Dann wirst du auch sofort feststellen, dass du nach 7 mal verschieben schon 00000001 hast, nach dem 8. mal erhälst du eben 0.



  • Weil du mit testchar = (1 >> 8); die 1 um 8 Stellen nach rechts verschiebst.

    Wenn du den Inhalt von testchar verschieben willst: testchar = testchar >> 8; oder testchar >>= 8;

    Ansonsten hat Knecht Purpecht natürlich auch recht.



  • Hm, hört sich ja alles schlüssig an, aber wenn ich jetzt z.B.

    char testchar = 128;
    testchar = (1 >> 1);
    

    berechnen lasse, dann steht nach der Ausführung auch 00000000 im char drin..., obwohl ja dann eigentlich 01000000, also 64 in Dez, drinstehen sollte...



  • So hab jetzt den Rechtsshift hinbekommen. Jetzt hab ich noch eine Frage:

    Ich hab diesen Code, der mir aus einem übergebenen BitVector ein Teilwort extrahieren soll. Kann das so funktionieren?

    testchar.bits[0] = 128;
    	for(int i=0; i<n; i=i+1)
    	{
    		*testchar.bits = *testchar.bits >> pos+i;
    
    		if(((bv_neu.bits[pos/8]) & *testchar.bits) == *testchar.bits)		//prüfen, ob BitVector an der
    		{													//Bit-Stelle mit Testchar übereinstimmt
    			maske.bits[i/8] = maske.bits[i/8] | (1 << (n-i-1)%8);
    		}
    	}
    

    Könnt ihr mir helfen?



  • Wenn ich mir z.B. nun ein 2-Elemente Array erstellen lasse, dann hab ich ja quasi vor der for-Schleife das hier drin stehen:

    10000000000000000

    Mit der zeile

    *testchar.bits = *testchar.bits >> pos+i;
    

    möchte ich nun über Pointer den 1er so verstellen, dass er mir auf die Stelle rückt, die mir "pos" angibt... Aber irgendwie funktioniert das noch nicht. Nach der ersten iteration der schleife passts nicht mehr...

    Wisst ihr woran das liegt?



  • Kann mir denn niemand helfen?



  • Hallo.

    Ich bräuchte wirklich dringend eure Hilfe!



  • Ignoriert ihr mich? Oder wollt ihr mir einfach nicht helfen? Wenn das Fall der ist, dann schließt doch einfach den Thread, dann weiß ich wenigstens was los ist!



  • Wie würdest Du es denn als Computersimulator machen? Also Du kannst nur die elemetaren Befehle, die der Computer auch kann und machst es mit Zettel un Papier.



  • Glaub mir bitte, das hab ich alles schon durch. Ich weiß nicht was falsch ist, sonst hätte ich ja hier keine Frage gestellt. Mittlerweile sieht der Code so aus:

    int auswahl = 0;
    	testchar.bits[auswahl] = 128;
    	*testchar.bits = *testchar.bits >> pos-1;
    	for(int i=0; i<n; i=i+1)
    	{
    		testchar.bits[auswahl] = testchar.bits[auswahl] >> 1;
    
    		if(testchar.bits[auswahl] == 0)
    		{
    			auswahl = auswahl + 1;
    			testchar.bits[auswahl] = 128;
    		}
    
    		if(((bv_neu.bits[pos/8]) & *testchar.bits) == testchar.bits[auswahl])
    		{
    			maske.bits[i/8] = maske.bits[i/8] | (1 << (n-i-1)%8);
    		}
    	}
    


  • Von welchem Typ sind denn deine Variablen?



  • das sind alles char-Arrays....



  • Schon mal dran gedacht das char i.A. signed ist und 0b1000000 = -128 ist.
    Da wird der arithmetische Shift genommen. Der schiebt das Vorzeichen mit.



  • Sollte ich dann also unsigned char nehmen?



  • Ähm, sorry sehe gerade, dass ich ja unsigned char in meiner Struktur verwende. Also an dem kann's nicht liegen. Funktinoieren tuts trotzdem noch nicht


Log in to reply