2016-07-14 16 views
2

Für ein Programm, das ich schreibe, um einen Scanner mit drei Ausgabefächern (Taschen) zu verbinden, muss ich ein SDK verwenden. Nach einem Aufruf an das SDK erhalte ich einen int, der den Status der Taschen darstellt. Um diesen "Taschen" Status zu bestimmen, finden Sie in der Dokumentation folgendes.Wie implementiert man dies mit der bitweisen & (und)?

Status der Ausgabefächer abrufen. Um festzustellen, ob eine Tasche voll oder leer ist, überprüfen Sie den Rückgabewert mit dem bitweisen AND-Operator (&). Gültige Werte sind:

  • Csd.POCKET.P1_EMPTY Tasche 1 ist leer.
  • Csd.POCKET.P2_EMPTY Tasche 2 ist leer.
  • Csd.POCKET.P1_FULL Tasche 1 ist voll.
  • Csd.POCKET.P2_FULL Tasche 2 ist voll.
  • Csd.POCKET.P3_EMPTY Tasche 3 ist leer.
  • Csd.POCKET.P3_FULL Tasche 3 ist voll.

Ich habe nie bitweise Operatoren verwendet, also bin ich ziemlich ratlos. Die Werte der oben genannten „Pocket“ Struktur sind wie folgt:

public struct POCKET 
{ 
    public const int P1_EMPTY = 1; 
    public const int P1_FULL = 16; 
    public const int P2_EMPTY = 2; 
    public const int P2_FULL = 32; 
    public const int P3_EMPTY = 4; 
    public const int P3_FULL = 64; 
} 

Ich habe auf Bitoperatoren lesen, und ich weiß, was sie tun, aber ich bin ratlos es für diesen speziellen Fall zu implementieren.

Vielen Dank im Voraus.

+1

Werfen Sie einen Blick auf diese http: //stackoverflow.com/questions/8447/what-does-the-flags-enum-attribute-mean-in-c – DavidG

+1

Eg 'if (returned_value & POCKET.P2_FULL == POCKET.P2_FULL) {...}' prüft, ob Tasche 2 voll ist –

+0

Auch mag es erwähnenswert sein, dass Sie einen Enum-Wert für 8 vermissen. – DavidG

Antwort

1

Typische Muster für die Prüfung Bitflags sind

// Entire key match 
if (returned_value & value_to_test == value_to_test) { 
    ... 
} 

// Partial key match 
if (returned_value & value_to_test != 0) { 
    ... 
} 

Z.B. Wenn Sie testen möchten, ob der Tasche # 3 ist voll:

if (returned_value & POCKET.P3_FULL == POCKET.P3_FULL) { 
    ... 
} 

Sie Flaggen über | und Test für teilweise Übereinstimmung solcher kombinierten Flagge kombinieren:

const int ALL_ARE_FULL = POCKET.P1_FULL | POCKET.P2_FULL | POCKET.P3_FULL; 

... 

// Test if any part of the flag is match (i.e. any pocket - at least one - is full) 
// Please, notice != 0 comparison 
if (returned_value & ALL_ARE_FULL != 0) { 
    ... 
} 

// Compare with this: all three pockets are full 
if (returned_value & ALL_ARE_FULL == ALL_ARE_FULL) { 
    ... 
} 
+0

Könnte das auch funktionieren? (pocketStatus & Csd.POCKET.P1_FULL)> 0. Ich habe es gerade in alten Code mit dieser Bibliothek gefunden. –

+1

@stefchri: in Ihrem * besonderen Fall * '> 0' wird es tun, aber es ist eine * schlechte Praxis *, z. Wenn const zufällig "POCKET.P1_FULL == 1 << 31" wäre, wäre der Compassion * gescheitert *. Bitte bleiben Sie bei '... & key == key' (* gesamte *' key' Übereinstimmung) und '... & key! = 0' (* partielle *' key' Übereinstimmung) –