【问题标题】:bitwise check if flag present按位检查标志是否存在
【发布时间】:2011-10-19 10:13:53
【问题描述】:

是否有通常用于检查标志是否存在于 int/其他数据类型中的方法?我想出了这样的事情:

if ((host&flagtocheckfor)==flagtocheckfor)

哪种方法可以正常工作-但是,这是一种设置标志的常用方法,这是通常检查标志的方式吗?还是有更简洁的方法?

【问题讨论】:

  • 您不需要 ==flagtocheckfor 部分。 & 的结果是 0(位关闭)或非 0(位打开),至少在 C 中,它已经对应于 False 和 True。
  • @librik,单位掩码没问题,但有些可能是多位掩码。看我的回答。

标签: language-agnostic bit-manipulation flags


【解决方案1】:

这很好正是在大多数支持它们的语言中检查位标志的方式。

例如:

#define BIT_7 0x80
#define BITS_0_AND_1 0x03

if ((flag & BIT_7) == BIT_7) ...
if ((flag & BITS_0_AND_1) == BITS_0_AND_1) ...

虽然您可以通过以下方式检查第一个内容:

if ((flag & BIT_7) != 0) ...

这实际上不会在第二个中起作用,因为如果设置了 其中一个 位,而不是 两个都设置,它将返回 true。

为了完整起见,C 允许您设置位掩码:

flag = flag | BIT_7;   // or you can also use 'flag |= BIT_7'

您可以使用以下方法清除它们:

flag = flag & (~BIT_7);

并使用以下方式切换它们:

flag = flag ^ BIT_7;

【讨论】:

    猜你喜欢
    • 2011-03-09
    • 2019-12-22
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多