关于C#:如何使用位bitwise & (and)实现此功能?

How to implement this using the bitwise & (and)?

本问题已经有最佳答案,请猛点这里访问。

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

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

  • 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"结构的值如下:

1
2
3
4
5
6
7
8
9
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
2
3
4
5
6
7
8
9
// Entire key match  
if (returned_value & value_to_test == value_to_test) {
  ...
}

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

例如,如果您想测试口袋3是否已满:

1
2
3
if (returned_value & POCKET.P3_FULL == POCKET.P3_FULL) {
  ...
}

您可以通过|组合标志,并测试该组合标志的部分匹配:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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) {
   ...
}