bitmasken
-
hy.
hab mal wieder ein problem, mit bits bzw. bitmasken
ich definier mir ne bitmaske in einer .h-datei. z.B:
#define BITMASK_0 0xC0in der c++ datei dann folgender code:
/*part1 is vom typ unsigned char*/ if (part1 & BIMTASK_0){ //do something } else if (part1 & BITMAS_1) { // do something else } // and so ondoch irgendwie huepft er mir in kein if-statement rein.
bsp: ich vergleiche zb folgendes (jeweils in extra if)
0xc0 & 0x00
0xc0 & 0x01
0xc0 & 0x02da sollte er, gleich bei der ersten matchen.
vielleicht liegt das problem daran, dass ich nur z.B. bit 6 und 7 matchen will, der rest is mir eigentlich gleich, aber sollte doch auch kein problem sein.
hat vielleicht jemand ne idee warum das net funzt?
tia
ciao
-
Was du suchst, ist | und nicht & (wenn ich dich richtig verstanden habe).
-
danke fuer d schnelle antwort. jetzt funktionierts. obwohl ich das nicht verstehe, is ja *logisches oder* oder nicht?
bsp: ich will, dass bit0 bis bit2 vergleichen, ob die gleich sind,
(a) is der wert, den ich hab, und mit (b) vergleiche. also sollte
folgendes matchen (mit logischem und):
(a) 1100 0001 &
(b) 0000 0001
--------------
(c) 0000 0001das hier sollte jedoch nicht matchen:
(a) 1100 0001 &
(b) 0000 0010
-------------
(c) 0000 0000oder nicht? mit logischem oder wuerde folgendes rauskommen:
bsp1:
(c) 1100 0001
bsp2:
(c) 1100 0011
-
0xC0 0000 0000 1100 0000 0x02 0000 0000 0000 0010Wieso sollte ein & hier ungleich 0 liefern?
-
baer schrieb:
bsp: ich vergleiche zb folgendes (jeweils in extra if)
0xc0 & 0x00
0xc0 & 0x01
0xc0 & 0x02da sollte er, gleich bei der ersten matchen.
Nope. ZB 0xc0 & 0x00 ergibt 0, was ja bekanntlich zu false evaluiert. Also wird nicht der if sondern der else Zweig ausgeführt.
Und Michaels Vorschlag ist auch keine Lösung für dein Problem.Du musst das etwas anders machen. Erstmal nimmst du dir eine Bitmaske für die zu vergleichenden Bits. Wenn du Bit 0 bis Bit 2 vergleichen willst, sollte die wie folgt aussehen:
m = 0x07; // Bit 0 bis 2 gesetztJetzt hast du mehrere Möglichkeiten. ZB blendest du mit der Maske erstmal alle unwichtigen Bits der zu vergleichenden Werte aus:
am = a & m; bm = b & m;Alle unwichtigen Bits sind jetzt 0, der Rest hat seinen ursprünglichen Wert behalten. Anschliessend kannst du beide Ergebnisse vergleichen und weisst damit, ob betreffende Bits gleich sind.
if (am == bm) //...Eine zweite Möglichkeit wäre, erstmal beide zu vergleichenden Werte zu xor'n:
c = a ^ b;Wie du sicherlich weisst, liefert xor bei Gleichheit 0 und bei Ungleichheit 1 (bitbezogen). Dh, alle Bits, die in a und b gleich sind, sind in c 0, alle anderen 1. Jetzt kannst du wieder mit der Maske alle unwichtigen Bits ausblenden.
cm = c & m;Ist das Ergebnis 0, waren die betreffenden Bits in a und b gleich.
if (cm == 0) //...
-
danke fuer die antworten.
werd das asap ausprobieren. (und weiters vertu ich mich immer mit false und true. true is ja alles unglich 0, und false is nur 0)
danke nomal fuer d hilfe. falls noch probleme auftauchen meld ich mich wieder.
ciao
david