【问题标题】:How to implement this using the bitwise & (and)? [duplicate]如何使用按位 & (and) 来实现这一点? [复制]
【发布时间】:2016-11-17 11:57:14
【问题描述】:

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

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

  • 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 已满。

我从来没有使用过位运算符,所以我很茫然。 上述“Pocket”结构的值如下:

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

我已经阅读了按位运算符,并且知道它们的作用,但是对于这种特定情况,我无法实现它。

提前谢谢大家。

【问题讨论】:

  • 例如if (returned_value & POCKET.P2_FULL == POCKET.P2_FULL) {...} 检查口袋 2 是否已满
  • 另外值得一提的是,您缺少 8 的枚举值。
  • @DavidG,我也这么想。但是 imo 写的 SDK 不是很好。
  • 我认为这是因为曾经有一个 P4(或者他们计划稍后添加它)

标签: c# bitwise-operators bitwise-and


【解决方案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) {
   ...
}

【讨论】:

  • 这也行吗? (pocketStatus & Csd.POCKET.P1_FULL) > 0。我刚刚在使用这个库的某人的旧代码中找到了它。
  • @stefchri: 在你的特殊情况 > 0 可以,但这是一个不好的做法,例如如果 const 恰好是 POCKET.P1_FULL == 1 << 31,那么同情就会失败。请坚持... & key == key整个 key匹配)和... & key != 0部分 key匹配)
猜你喜欢
  • 1970-01-01
  • 2012-01-24
  • 1970-01-01
  • 2017-08-30
  • 2020-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多