如何使用按位和& (和)?

时间:2016-07-14 14:03:59

标签: c# bitwise-operators bitwise-and

对于我写的连接到带有三个输出托盘(口袋)的扫描仪的程序,我需要使用SDK。在调用SDK之后,我收到一个表示口袋状态的int。要确定这个"口袋"状态以下是在文档中。

获取输出口袋的状态。要确定口袋是满还是空,请使用按位AND(&)运算符检查返回的值。有效值为:

  • Csd.POCKET.P1_EMPTY Pocket 1为空。
  • Csd.POCKET.P2_EMPTY Pocket 2为空。
  • Csd.POCKET.P1_FULL Pocket 1已满。
  • Csd.POCKET.P2_FULL Pocket 2已满。
  • Csd.POCKET.P3_EMPTY Pocket 3为空。
  • Csd.POCKET.P3_FULL Pocket 3已满。

我从未使用过按位运算符,所以我很茫然。 上述" Pocket"的价值struct如下:

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 个答案:

答案 0 :(得分:1)

测试位标志的典型模式是

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

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

E.g。如果你想测试口袋#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) {
   ...
}