我需要一个带有这样的标题的函数:
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。
答案 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
进行比较。如果它们相等,则a
是b
的“前缀”。
此算法的性能取决于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;
}
(就在我的头顶,所以可能会有错误。)