Bitwise Vergleiche?



  • Hi.
    Folgendes Beispiel:

    enum Bits
    {
      Eins = 1 << 0,
      Zwei = 1 << 1,
      Drei = 1 << 2,
      Vier = 1 << 3,
      Funf = 1 << 4
    }
    
    // ...
    
    Bits Input = Eins | Zwei | Vier;
    Bits Check1 = Eins | Drei | Funf;
    Bits Check2 = Drei | Funf;
    Bits Check3 = Eins | Zwei;
    

    Gibt es eine Möglichkeit, bequem zu vergleichen, ob Input valid zu jeweils Check1 , Check2 und Check3 ist? Ich möchte mir mühseliges Input & Eins usw. ersparen. Geht das?

    Rauskommen sollte:
    Check1 passt,
    Check2 passt nicht,
    Check3 passt

    Gruß



  • Es kommt drauf an wie du vergleichen willst. Wenn du prüfen willst ob Input genau einem der Check Variablen entspricht, dann kannst du einfach mit == arbeiten.
    Wenn du prüfen willst ob in Input alle Flags eines bestimmten Checks gespeichert sind dann wirst du wohl folgendes benutzen müssen:

    if ((Input & Eins) && (Input & Drei) && (Input & Fuenf))
    {
      // Check1 passt
    }
    


  • Einfach mit Check1 verunden, und wenn genau Check1 übrig bleibt, passt es.

    int Input = Eins | Drei | Vier | Funf;
    	int Check1 = Eins | Drei | Funf;
    	int Check2 = Drei | Funf;
    	int Check3 = Eins | Zwei;
    	if((Input&Check1)==Check1) {
    		printf("Yeah!");
    	}else {
    		printf("Nooo...");
    	}
    


  • Hab mir schon gedacht das es da noch irgendeinen Byte-Hack gibt.



  • Also, es geht um folgendes: Der User kann eine Flagliste erstellen, in der er definiert, in welchen Fällen die Aktion X ausgeführt werden soll (Beispiel: Flaglist = Eins | Zwei | Vier ). Dann soll anhand verschiedener Parameter in der Funktion eine weitere Checklist erstellt werden, welche dann alle Fälle beinhaltet, die zutreffen (Beispiel: Checklist = Eins | Vier ).

    Das heißt, die Abfrage soll gültig sein, sobald einer der Bits in der Checklist mit der Flaglist übereinstimmt.

    Gruß



  • Es muss einfach nur ein Bit übereinstimmen? Dann kannst du doch einfach verunden, und wenn da noch ein Bit übrig bleibt (übereinstimmt), ist es true:

    int Input = Eins | Drei | Vier | Funf;
        int Check1 = Eins | Drei | Funf;
        int Check2 = Drei | Funf;
        int Check3 = Eins | Zwei;
        if(Input&Check1) {
            printf("Yeah!");
        }else {
            printf("Nooo...");
        }
    


  • Cool. Doch so einfach 😛
    Dankeschön an alle!

    Gruß


Anmelden zum Antworten