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 0xC0
    

    in 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 on
    

    doch irgendwie huepft er mir in kein if-statement rein.

    bsp: ich vergleiche zb folgendes (jeweils in extra if)
    0xc0 & 0x00
    0xc0 & 0x01
    0xc0 & 0x02

    da 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 0001

    das hier sollte jedoch nicht matchen:
    (a) 1100 0001 &
    (b) 0000 0010
    -------------
    (c) 0000 0000

    oder nicht? mit logischem oder wuerde folgendes rauskommen:
    bsp1:
    (c) 1100 0001
    bsp2:
    (c) 1100 0011

    😕



  • 0xC0    0000 0000 1100 0000
    0x02    0000 0000 0000 0010
    

    Wieso sollte ein & hier ungleich 0 liefern?



  • baer schrieb:

    bsp: ich vergleiche zb folgendes (jeweils in extra if)
    0xc0 & 0x00
    0xc0 & 0x01
    0xc0 & 0x02

    da 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 gesetzt
    

    Jetzt 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


Anmelden zum Antworten