在值 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=0b11011001
、value&0xaaaaaaaa
是 0b10001000
,则右移会产生 0b01000100
~value
是0b11111111111111111111111100100110
,与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;
}
这是我第一次使用 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=0b11011001
、value&0xaaaaaaaa
是 0b10001000
,则右移会产生 0b01000100
~value
是0b11111111111111111111111100100110
,与0x55555555
相结合产生0b01010101010101010101010100000100
,最后and产生0b100
,表明满足条件3。
首先,在C++中,int是signed int的缩写,通常用4个字节,即32位来表示。所以你的函数只适用于输入整数的最后 8 位。
其次,1< 这意味着你所有的位移位都向左偏移了 1 个位置。 第三,当任何条件为假时,最后一个 if 语句将 return 假,这意味着只有 10101010 return 为真。1<<8 means (01) 00 00 00 00
1<<7 means 10 00 00 00
从 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;
}