在C中检查位的值

在C中检查位的值,c,binary,bit-manipulation,C,Binary,Bit Manipulation,我正在学习如何检查位的值。我的教科书宣称如下 '即使标志中的位1设置为1,标志中的其他位设置也会使比较不真实。相反,您必须首先屏蔽标志中的其他位,以便仅将标志的位1与屏蔽:' if ((flags & MASK) == MASK) puts("Wow!"); 我很难理解这个概念 例如,让flags=00001111和MASK=10110110 因此,标志和掩码=00000110 如果我们现在比较MASK和00000110,我们将比较第2位和第3位。但是,我的目标不是比较特定(单个)位的

我正在学习如何检查位的值。我的教科书宣称如下

'即使
标志
中的位1设置为1,
标志
中的其他位设置也会使比较不真实。相反,您必须首先屏蔽
标志
中的其他位,以便仅将
标志
的位1与
屏蔽
:'

if ((flags & MASK) == MASK)
puts("Wow!");
我很难理解这个概念

例如,让
flags=00001111
MASK=10110110

因此,
标志和掩码=00000110

如果我们现在比较
MASK
00000110
,我们将比较第2位和第3位。但是,我的目标不是比较特定(单个)位的值吗

我一定是误会了。如果有人能澄清我的误解并解释正确的方法,我将不胜感激


谢谢。

如果我正确理解了问题,可以使用包含要测试的特定位的位掩码来检查单个位。如果要检查第一位(对应于2的值),则使用

result = flags & 00000010
然后检查
结果
,如果未设置位,则结果为零,如果设置位,则结果为非零。更广义地说,我们可以使用

result = flags & (00000001 << i)
result=flags&(00000001)
  • 条件
    (标志和掩码)!=0
    检查
    掩码指定的
    标志
    位是否设置为1

  • 条件
    (标志和掩码)=MASK
    检查
    MASK
    指定的所有
    标志
    位是否设置为1

  • 对称地

  • 条件
    (标志和掩码)=0
    检查由
    掩码指定的所有
    标志
    位是否设置为0

  • 条件
    (标志和掩码)!=MASK
    检查
    MASK
    指定的
    标志
    位是否设置为0

  • 在每个特定情况下选择您需要的一个

    如果只需要检查一个位(即,
    MASK
    仅包含一个设置为1的位),则条件1和2是等效的(条件3和4也是等效的)


    从你引用的文本中还不完全清楚
    MASK
    是否可以包含多个设置为1的位。

    @FredrikPihl谢谢。他们似乎使用了移位运算符,而不是等式。在我教科书中的信息背景下,我做错了什么?你通常不会在屏蔽后与MASK进行比较,而是在不要将结果用作布尔值、枚举值或其他任何值。@IljaEverilä与掩码进行比较,检查掩码中的每一位是否已设置;将结果用作布尔值,检查掩码中的至少一位是否已设置