2016-07-14 35 views
2

對於我編寫的用於連接具有三個輸出托盤(口袋)的掃描儀的程序,我需要使用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

Eg 'if(returned_value&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'(* whole *'key' match)和'...&key!= 0'(* partial *'key' match) –

相關問題