在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ä与掩码进行比较,检查掩码中的每一位是否已设置;将结果用作布尔值,检查掩码中的至少一位是否已设置