找出(在C ++中)二进制数是否是另一个的前缀

时间:2013-06-18 16:03:04

标签: c++ c binary bit-manipulation integer-arithmetic

我需要一个带有这样的标题的函数:

bool is_prefix(int a, int b, int* c) {
    // ...
}

如果a是,读取为二进制数字串,前缀为b,则将* c设置为b的其余部分(即“什么b具有多于a”)并返回true。否则,返回false。假设二进制字符串始终以“1”开头。

当然 - 通过逐位比较(leftshift b直到b == a)很容易做到。但是,是否有一种更有效的解决方案,而不会迭代这些位?

示例:a = 100(4),b = 1001(9)。现在将*c设置为1。

2 个答案:

答案 0 :(得分:3)

您可以使用自己喜欢的"fast" method to find the highest set bit。我们调用函数msb()

bool is_prefix (int a, int b, int *c) {
    if (a == 0 || b == 0 || c == 0) return false;
    int d = msb(b) - msb(a);
    if (d < 0) return false;
    if ((b >> d) == a) {
        *c = b ^ (a << d);
        return true;
    }
    return false;
}

转换b,使其高位与a对齐,并将其与a进行比较。如果它们相等,则ab的“前缀”。

此算法的性能取决于msb()的性能。如果它是常数,则该算法是常数。如果msb()价格昂贵,那么“简单方法”可能是最快的方法。

答案 1 :(得分:0)

我不太确定,但是会有类似的工作:

bool
is_prefix( unsigned a, unsigned b, unsigned* c )
{
    unsigned mask = -1;
    while ( mask != 0 && a != (b & mask) ) {
        a <<= 1;
        mask <<= 1;
    }
    c = b & ~mask;
    return mask != 0;
}

(就在我的头顶,所以可能会有错误。)