有两个二进制数字就可以了

时间:2017-05-01 12:19:41

标签: algorithm binary pseudocode

是否有算法可以找到a和b之间的所有二进制数,其中只有两个? 例如:

a = 5
b = 10
find(a, b)

会找到

5 = 00000101
6 = 00000110
9 = 00001001
10 = 00001010

2 个答案:

答案 0 :(得分:1)

这些数字的格式为

2^m + 2^n

m > n

您可以通过mn上的详尽搜索找到它们。

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的值。

当然,只有abunsigned范围内时,才能使用此格式。