是否有算法可以找到a和b之间的所有二进制数,其中只有两个? 例如:
a = 5
b = 10
find(a, b)
会找到
5 = 00000101
6 = 00000110
9 = 00001001
10 = 00001010
答案 0 :(得分:1)
这些数字的格式为
2^m + 2^n
m > n
。
您可以通过m
,n
上的详尽搜索找到它们。
M= 1
while M < b:
N= 1
while M + N <= b:
if a <= M + N:
print M + N
N+= N
M+= M
这可能会略微优化,以避免在2^m < a
时进行搜索,但效益很小:复杂度为O(log²b)
,已经很小。
答案 1 :(得分:1)
遍历包含相同数量1位的所有位模式的比特黑客技巧如下所示
unsigned next_combination(unsigned x)
{
unsigned u = x & -x;
unsigned v = u + x;
x = v + (((v ^ x) / u) >> 2);
return x;
}
它按升序生成值。它采用先前的值并将其转换为具有相同数量的1位的下一个值。这意味着您只需从大于或等于a
的最小位组合开始并迭代,直到遇到大于b
的值。
当然,只有a
和b
在unsigned
范围内时,才能使用此格式。