2017-05-01 25 views
-1

是否有一種算法可以找到a和b之間的所有二進制數字,其中只有兩個數字? 例如:帶有兩個的二進制數引起它

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

它會找到

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

你喜歡C或Javascript嗎? –

+0

C或Java,但僞代碼也不錯 – Davide

回答

1

的位黑客特技看起來通過包含相同數量的1比特的所有比特paterns迭代如下

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的範圍內時,它纔會起作用。

+0

'-'對無符號數沒有影響。 –

+0

它是否保證按遞增順序迭代值? –

+0

@Yves Daoust:此代碼使用C或C++。是的,在C和C++中,一元'-'對'unsigned'起作用(有效)。 – AnT

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),這已經是小的。