【问题标题】:Check Multiple boolean condition using dword in c++在 C++ 中使用 dword 检查多个布尔条件
【发布时间】:2017-08-08 01:16:27
【问题描述】:

对于在 C++ 中使用 DWORD 代替布尔值,我真的很陌生。因此,请原谅我的问题。

我有一个enum

enum foo
{
  foo1 = 0x0;
  foo2 = 0x1
  //....
}
DWORD foo;

我正在使用这个enum 来检查多个条件:

if(somethinghappenstothisvariable)
{
  foo|= foo1;
}

if(somethinghappenstosecondvariable)
{
 foo|=foo2;
}

现在在另一个文件中,我必须检查单个变量的条件

if(foo &foo1)
{
  //do something;
}

if(foo & foo2)
{
 //do something;
}

我认为 |= 将值加到 DWORD 如果两个条件都是 true 导致 foo & foo2 只为真,而 foo & foo1 不会是 DWORD 的值是1。因此,我想知道是否有任何方法可以检查单个 DWORD 值。

【问题讨论】:

  • foo|= foo1; ==> foo|= 0 == foo, and foo & foo1 == foo & 0 ==> 0, 我猜你想要 foo1 = 0x1(2^0), foo2 = 0x2(2^1), foo3 = 0x4 (2^2)...
  • 是的,foo1 在您当前的实现中为零。最低的实际位是值“1”而不是“0”。 “0”不匹配任何位。每个位值也需要是之前的两倍。
  • 谢谢,成功了。
  • 请注意,如果foo1foo2 等是位移指示符(即用作foo |= 1 << foo1 而不是foo |= foo1),则foo1 应为0。我相信我已经看到了这两个版本。我个人更喜欢前者,其中fooN 是位的值而不是它的数字,因为它更容易定义和使用“清除所有”和“设置所有”标志。 Here's 我的意思的一个简单例子。
  • 对枚举类型和变量名都使用foo 是个坏主意。

标签: c++ enums dword


【解决方案1】:

问题:1 = 位 0,0 无效。 要检查每个“条件”应该代表一个单独的位(位 0 = 1、位 1 = 2 等)

所以 - 一个简单的更改:foo1 = 0x01; foo2 = 0x02; 应该可以解决它。 注意:任何额外的检查都应该代表位值,而不是序数。 换句话说,foo3 = 0x04;(不是0x03;

【讨论】:

    【解决方案2】:

    您可以通过使用移位创建这些常量来更轻松地纠正:

    enum foo
    {
      foo1 = 1 << 0;
      foo2 = 1 << 1;
      foo3 = 1 << 2;
      //....
    }
    

    这样您就可以确保每个掩码都设置了一个位。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-30
      • 2021-01-29
      • 2016-10-29
      • 2012-06-19
      • 1970-01-01
      相关资源
      最近更新 更多