C++如何判断一个数字是否以某个比特模式结尾

4

我想知道一个数字是否以某些预定义的位模式结尾。

例如,我想知道数字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

:)


1
提示:搜索“位运算C ++”,您应该能够使用非常简单的操作完成此操作... - Nim
4个回答

3

对于第一个案例:

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

1
如果您知道B中的位数,那么您需要构建一个具有这个位数为1的模式。假设在您的系统上int有32位:
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;
}

你的掩码计算代码只有在B中的“最左边”位为1时才有效,例如,如果你想匹配模式00101,它不会返回5。这可能没问题,因为问题说明B应该是一个数字(暗示最高位是1)。 - Ferdinand Beyer
@ferdinand:没错。实际上,最高位必须为1,或者你必须知道B的长度(以比特为单位),并且只使用我答案的前一部分。 - Benoit Thiery

0
unsigned 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");

使用@Benoit上面建议的方法来计算B中的位数。

4
测试失败: 0x111 & 0x100 = 0x100。意思是对于这个测试,结果不符合预期。具体来说,把十六进制数0x111和0x100做按位与运算,得到的结果应该是0x100,但实际上得到了0x0。 - Ferdinand Beyer
1
“N&B == B”显然不能满足OP的要求('101'是否以'100'结尾?) - NPE

0

可以为任何长度的位模式生成掩码。这里是一个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");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接