2016-07-14 8 views
2

3つの出力トレイ(ポケット)を備えたスキャナに接続するためのプログラムについては、SDKを使用する必要があります。 SDKへの呼び出しの後、私はポケットの状態を表すintを受け取ります。この「ポケット」状態を判断するために、以下がドキュメントに記載されています。ビット単位の&(および)を使用してこれを実装する方法は?

出力ポケットのステータスを取得します。ポケットがいっぱいであるか空であるかを判断するには、ビット単位のAND(&)演算子を使用して戻り値を確認します。有効な値は次のとおりです。

  • Csd.POCKET.P1_EMPTYポケット1が空です。
  • Csd.POCKET.P2_EMPTYポケット2は空です。
  • Csd.POCKET.P1_FULLポケット1がいっぱいです。
  • Csd.POCKET.P2_FULLポケット2がいっぱいです。
  • Csd.POCKET.P3_EMPTYポケット3は空です。
  • Csd.POCKET.P3_FULLポケット3がいっぱいです。

私はビット演算子を使用していないので、私はかなり迷っています。次のように上記の「ポケット」構造体の 値は次のとおりです。

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

私はビット演算子をよく読んでいると私は、彼らが何をすべきか知っているが、私は、この特定のケースのためにそれを実装する損失でいます。

ありがとうございます。テストビットフラグの

+1

このHTTPを見てみましょう: //stackoverflow.com/questions/8447/what-does-the-flags-enum-attribute-mean-in-c – DavidG

+1

例'if(returned_value&POCKET.P2_FULL == POCKET.P2_FULL == POCKET.P2_FULL){...}'はポケット2がいっぱいであるかどうかを確認します –

+0

また、8の列挙値がないことに言及する価値があります。 – DavidG

答えて

1

典型的なパターンは、例えば

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

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

ありますあなたはポケット#3がいっぱいになっているかどうかをテストする場合:

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

あなたは、このような組み合わせフラグの部分一致ため|とテストを経てフラグを組み合わせることができます。

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

これも動作する? (pocketStatus&Csd.POCKET.P1_FULL)> 0. 私はこのライブラリを使用している誰かの古いコードでそれを見つけました。 –

+1

@stefchri:あなたの*特定のケースでは ''> 0 'は行いますが、悪い習慣です。 constが 'POCKET.P1_FULL == 1 << 31'であった場合、compasionは失敗します*。 '...&key == key'(*全体*' key'マッチ)と '...&key!= 0'(* partial *' key'マッチ)に固執してください。 –

関連する問題