在值 C++ 中搜索 set/unset 位组合

Search for set/unset bit combination in value C++

这是我第一次使用 C++,我正在尝试确定给定 int 的位是否属于特定类别:

对于传递给函数的每个 int,我们实施规则,即每 2 位代表消息中的一个奇异值,如果该消息的值为 2(二进制 10),则我们需要 return布尔值与假。示例:(在二进制表示列中,我将每 2 位分开,以便更明显)

Given value Binary representation condition met Returns
0 00 00 00 00 None true (no condition met)
128 10 00 00 00 1st false
32 (00) 10 00 00 2nd false
8 (00 00) 10 00 3rd false
2 (00 00 00) 10 4th false
217 11 01 10 01 3rd false
153 10 01 10 01 1st & 3rd false

我找到了 this and this 并尝试制作一个简单的函数,但它没有按预期工作。

bool isConditionVoid(int value) {
    bool Condition1 = (value &(1<<8)) && !(value&(1<<7)); 
    bool Condition2 = (value &(1<<6)) && !(value&(1<<5)); 
    bool Condition3 = (value &(1<<4)) && !(value&(1<<3)); 
    bool Condition4 = (value &(1<<2)) && !(value&(1<<1)); 
    if (!Condition1 || !Condition2 || !Condition3 || !Condition4)
        return false;
    else
        return true;
} 

知道哪个条件失败可能是一个加号,但这不是必需的。任何帮助将不胜感激。

unsigned int condition=((value&0xaaaaaaaa)>>1)&((~value)&0x55555555);

这会计算一个数字,该数字为每条消息设置了一个位,即 2。例如,如果 value=0b11011001value&0xaaaaaaaa0b10001000,则右移会产生 0b01000100 ~value0b11111111111111111111111100100110,与0x55555555相结合产生0b01010101010101010101010100000100,最后and产生0b100,表明满足条件3。

首先,在C++中,int是signed int的缩写,通常用4个字节,即32位来表示。所以你的函数只适用于输入整数的最后 8 位。

其次,1<

1<<8 means (01) 00 00 00 00
1<<7 means      10 00 00 00

这意味着你所有的位移位都向左偏移了 1 个位置。

第三,当任何条件为假时,最后一个 if 语句将 return 假,这意味着只有 10101010 return 为真。

从 C++14 开始,您可以使用二进制表示以易于理解的方式编写函数:

bool isConditionVoid(std::uint8_t value) {
    bool Condition1 = ((value & 0b00'00'00'11) == 0b00'00'00'10);
    bool Condition2 = ((value & 0b00'00'11'00) == 0b00'00'10'00);
    bool Condition3 = ((value & 0b00'11'00'00) == 0b00'10'00'00);
    bool Condition4 = ((value & 0b11'00'00'00) == 0b10'00'00'00);

    return !Condition1 && !Condition2 && !Condition3 && !Condition4;
}