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 abgeschlossenWenn 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"; }