Binär Dezimal-Zahl vergleichen? [gelöst]



  • Hallo,

    wie kann ich eine Dezimal-Zahl binär oder ähnlich Prüfen?

    Folgendes Beispiel dazu: Ein Auftrag befindet sich in einem Status (oder auch mehrere):

    0 = neuer Auftrag
    1 = Ware auf Lager
    2 = Ware bestellt
    4 = Ware angefragt
    8 = Ware abgerufen
    16 = Ware gesendet
    32 = Rechnungsprüfung
    64 = Rücklieferung
    128 = Mahnung
    256 = Auftrag abgeschlossen

    Wenn die Ware gesendet wurde (16) und eine Rechnungsprüfung (32) erforderlich ist, befindet sich der Auftrag in dem Status 48. Wie kann ich jetzt Prüfen ob eine bestimmte Position (z.B. Rechnungsprüfung) dem Auftrag zugeordnet ist?

    if( (16 in 48 enthalten) == true )
    {
       mache irgendetwas...
    }
    

    Wie geht das?



  • Der Compiler wandelt automatisch in Binaerzahlen um. Mache dir die Zahlen im Binaerformat deutlich, verwende ein bitweises (und).



  • Mit bitweisen Operatoren.

    int status=0;
    status|=0x1;  //Bit 1 setzen
    status|=0x4;  //Bit 3 setzen
    
    if(status & (1<<1) {
      std::cout << "Bit 1 gesetzt" << std::endl;
    }
    if(status & (1<<2) {
      std::cout << "Bit 2 gesetzt" << std::endl;
    }
    if(status & (1<<3) {
      std::cout << "Bit 3 gesetzt" << std::endl;
    }
    

    Schau dir besser mal ganz genau die Doku zu den verwendeten Operatoren an.



  • Ist jetzt aus der Python-Konsole, aber funktionieren tut das in C++ identisch:

    >>> stat = 1 | 4 | 16
    >>> stat & 1
    1
    >>> stat & 2
    0
    >>> stat & 4
    4
    >>> stat & 8
    0
    >>> stat & 16
    16
    >>> stat & 32
    0
    


  • Das verstehe ich nicht so ganz, denn ich erhalte folgendes Ergebnis:

    int status=0;
    	status|=0x1;  //Bit 1 setzen
    	//status|=0x4;  //Bit 2 setzen
    	//status|=0x8;  //Bit 3 setzen
    	status|=0x16; //Bit 4 setzen
    
    	if(status & (1<<0)) {
    		qDebug() << "Bit 1 gesetzt";
    		//OK
    	}
    	if(status & (1<<1)) {
    		qDebug() << "Bit 2 gesetzt";
    		//OK
    	}
    	if(status & (1<<2)) {
    		qDebug() << "Bit 3 gesetzt";
    		//OK
    	}
    	if(status & (1<<3)) {
    		qDebug() << "Bit 4 gesetzt";
    		//NOK
    	}
    	if(status & (1<<4)) {
    		qDebug() << "Bit 5 gesetzt";
    		//OK
    	}
    

    Jetzt sollte aber nur, Bit 1 und Bit 4 OK sein! Verstehe ich da etwas falsch und wie funktioniert dass was ich möchte?



  • Sharpie schrieb:

    status|=0x16; //Bit 4 setzen

    Schau Dir die Zeile nochmal an.



  • 0x16 ist eine hexadezimale Angabe und nicht gleich dezimal 16 (es ist 22)!



  • Vielen Dank, an alle! Ich hab es verstanden, es funktioniert jetzt:

    int status=0;
        status|=0x1;  //Bit 1 setzen
        status|=0x2;  //Bit 2 setzen
        status|=0x4;  //Bit 3 setzen
    
        if(status & (1<<0)) {
            qDebug() << "Bit 1 gesetzt";
        }
        if(status & (1<<1)) {
            qDebug() << "Bit 2 gesetzt";
         }
        if(status & (1<<2)) {
            qDebug() << "Bit 3 gesetzt";
        }
    

Anmelden zum Antworten