我想知道一个数字是否以某些预定义的位模式结尾。
例如,我想知道数字N是否以B结尾。
其中,N是任何数字,B也是任何数字。
例如:
if N = 01011100
B = 100 then this C++ function should return 1 here in this case 1
if N = 01011100
B = 101 then this function should return 0
:)
对于第一个案例:
unsigned n = 0x5C;
unsigned m = 0x7; // "mask"
unsigned b = 0x4;
if ((n & m)==b) {
...do something...
}
01011100 n
00000111 m
00000100 n & m (bitand operator)
00000100 b
unsigned int mask = 0xFFFFFFFF >> (32 - numberOfBitsInB);
if (N & mask == B)
printf("%d ends with %d\n", N, B);
else
printf("Nope");
你也可以通过以下方式计算 B 中的位数:
int tmpB = B;
int numberOfBitsInB = 0;
while (tmpB)
{
numberOfBitsInB++;
tmpB >>= 1;
}
00101
,它不会返回5。这可能没问题,因为问题说明B应该是一个数字(暗示最高位是1)。 - Ferdinand Beyerunsigned int mask = ~0 >> (sizeof(unsigned int) * 8 - num_bits_in_B);
if (N & Bitmask == B)
printf("%d ends with %d\n", N, B);
else
printf("Nope");
0x111 & 0x100 = 0x100
。意思是对于这个测试,结果不符合预期。具体来说,把十六进制数0x111和0x100做按位与运算,得到的结果应该是0x100,但实际上得到了0x0。 - Ferdinand Beyer可以为任何长度的位模式生成掩码。这里是一个C语言示例。这将防止您硬编码0x7,如果您想检查是否有超过3个位匹配。
bool bitPattern(int N, int B)
{
int shift = 0;
int mask = 0x0;
while(B >> shift++ > 0) mask |= 0x01 << shift-1;
return (N & mask) == B;
}
int main(int argc, char *argv[]) {
printf("01011100 ends with 100 ? %s\n", bitPattern(0x5C, 0x04) ? "Yes" : "No");
printf("01011100 ends with 101 ? %s\n", bitPattern(0x5C, 0x05) ? "Yes" : "No");
}