如何集体检查位是否设置在无符号整数中

How to collectively check whether bits are set in an unsigned integer?

本文关键字:无符号整数 设置 是否 何集体 检查      更新时间:2023-10-16

给定一个无符号整数,我想知道是否有一种方法可以确定是否在一次操作中设置了多个位。已经有一种替代方法可以通过逐点检查来实现这一点(如下所示),但我想知道是否有一种方法可以集体检查所有的位。

typedef enum Foo_X
{
  Foo_0 = 0x1,
  Foo_1 = 0x2,
  Foo_2 = 0x4,
  Foo_3 = 0x8,
} Foo_X;
bool CheckFoo ( UINT Value, Foo_X Foo_to_Check )
{
    if (Value & Foo_to_Check)
    {
        // Foo_to_Check is present
        return true;
    }
}
void main()
{
    UINT value = GetValueFromSomewhere();
    if (CheckFoo(value, Foo_0) && CheckFoo(value, Foo_3))
        // both Foo_0 and Foo_3 are present
    else
        // not both present
}

下面也显示了使用集体方法的示例。有什么想法吗?TIA!

bool CheckFooTogether ( UINT Value, UINT Foos_to_Check )
{
    // check value against Foos_to_Check collectively
}
void main()
{
    UINT value = GetValueFromSomewhere();
    if (CheckFooTogether (value, Foo_0 | Foo_3))
        // both Foo_0 and Foo_3 are present
    else
        // not both present           
}

(Value&Foos_to_Check)==Foos_to_Check

(value & (FOO_0 | FOO_3)) == (FOO_0 | FOO_3)

FOO_0FOO_3都被设置时返回true

您可以通过简单的逐位and检查来实现这一点:

bool CheckFooTogether ( UINT Value, UINT Foos_to_Check )
{
    // check value against Foos_to_Check collectively
    if( (Value & Foos_to_Check) == Foos_to_Check)
        return true;
    else
        return false;
}
int main()
{
    UINT value =  Foo_3 | Foo_2;
    if (CheckFooTogether (value, Foo_0 | Foo_3))
        // both Foo_0 and Foo_3 are present
        cout << "both present";
    else
        // not both present    
        cout << "not both present";
}

示例