是否有一種算法可以找到a和b之間的所有二進制數字,其中只有兩個數字? 例如:帶有兩個的二進制數引起它
a = 5
b = 10
find(a, b)
它會找到
5 = 00000101
6 = 00000110
9 = 00001001
10 = 00001010
是否有一種算法可以找到a和b之間的所有二進制數字,其中只有兩個數字? 例如:帶有兩個的二進制數引起它
a = 5
b = 10
find(a, b)
它會找到
5 = 00000101
6 = 00000110
9 = 00001001
10 = 00001010
的位黑客特技看起來通過包含相同數量的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
的值。
當然,在這種形式下,只有當您的a
和b
在unsigned
的範圍內時,它纔會起作用。
'-'對無符號數沒有影響。 –
它是否保證按遞增順序迭代值? –
@Yves Daoust:此代碼使用C或C++。是的,在C和C++中,一元'-'對'unsigned'起作用(有效)。 – AnT
這些數字形式
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)
,這已經是小的。
你喜歡C或Javascript嗎? –
C或Java,但僞代碼也不錯 – Davide