Nutzung von Bitmasken zum Schalten!
-
Hallo Profis,
ich muss für mein Studium Bismasken zum Schalten einzelner Bits benutzen. Folgenden Code habe ich geschrieben:
#include <stdio.h> #define M3689O 0110100100 #define M3689H 0x110100100 void main (void) { int a = 0110100100; int a2 = 0x110100100; int b = a + 1; int b2 = a2 + 1; int c; printf("Ueberpruefe Bitmaske M3689O Oktal\n"); c = a^M3689O; printf("Das Ergebnis ist %3i\n", c); c = b^M3689O; printf("Das Ergebnis ist %3i\n", c); printf("--------\n"); printf("Ueberpruefe Bitmaske M3689H Hexadezimal\n"); c = a2^M3689H; printf("Das Ergebnis ist %3i\n", c); c = b2^M3689H; printf("Das Ergebnis ist %3i\n", c); }
Mit der Oktalen Maske funktioniert es wunderbar. Die erste Ausgabe ist Null, die zweite ist 1. Wenn ich eine andere Zahl in b modifiziere, ergibt es ebenfalls ein sinnvolles Ergebnis.
Nicht aber bei der Hexadezimalen Maske. Dort kommt stets eine exorbitant große Zahl raus. Kann mir jemand sagen, wo mein Fehler liegt?
Vielen Dank im Voraus.
Jan
-
Bei dir hat die Hexzahl 9 Stellen. Bei einem 32-Bit Integer sind aber nur 8 Stellen sinnvoll.
Das muss auch eine Compilerwarnung geben. Unbedingt beachten!
Wenn du wirklich Bits diese 9 Bits haben willst, ist das mehr 0x1A4 oder 0644 oder 420
-
Trotz des Overflows sollte es eigentlich funktionieren. Bei mir tut es dies auch. Auf codepad auch. Ist das auch 1:1 der nicht funktionierende Code?
-
Hab es jetzt wie folgt gemacht:
11 0100 1000 = 3 4 8
M3689H = a2 = 0x348
*Jetzt funktioniert es.
Danke.
Die Warnung ist auch weg.
-
Ja, es war exakt der Code. Ich benutze lcc32. Die Warnung war da.
Es war aber die falsche Zahl. Ich soll das 3te, 6te, 8te und 9te Bit schalten. Hatte übersehen, dass man bei Null anfängt zu zählen
Mit 0x348 funktioniert es jetzt aber.
-
Das ist dann ja auch komplett anderer Zahlenbereich
-
Ist 0x348 nicht das gleiche wie 0x1101001000 im Hexadezimalen?
-
0x348 ist hexadezimal
11 0100 1000 ist dualin diesem Fall sind sie identisch. Für Dualzahlen nimmt man kein 0x!
Edit: 0x1101001000 ist das im dualsystem:
0001 0001 0000 0001 0000 0000 0001 0000 0000 0000
-
Ok, hab es nochmal geändert. Ich habe leider erst mit dem ganzen Bit-Zeug angefangen und bin da noch etwas jungfräulich. Gefordert ist einfach eine Maske zu schreiben (Oktal und Hexadezimal), welche das 9te, 8te, 6te und 3te Bit schaltet. Der Code ist jetzt wie folgt:
// 1 101 001 000 = 1510 Oktal // 11 0100 1000 = 348 Hexadezimal // Ungewandelt: 2^9+2^8+2^6+2^3 = 840 #include <stdio.h> #define M3689O 01510 #define M3689H 0x348 void main (void) { // Ungewandelt von Binär in Dezimal: // 2^9+2^8+2^6+2^3 = 840 int a = 840; int a2 = 840; int c; printf("Ueberpruefe Bitmaske M3689O Oktal\n"); c = a^M3689O; printf("Das Ergebnis ist %3i. Alle 1en wurden geschaltet!\n", c); printf("--------\n"); printf("Ueberpruefe Bitmaske M3689H Hexadezimal\n"); c = a2^M3689H; printf("Das Ergebnis ist %3i. Alle 1en wurden geschaltet!\n", c); }