2017-05-01 3 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

unsigned next_combination(unsigned x) 
{ 
    unsigned u = x & -x; 
    unsigned v = u + x; 
    x = v + (((v^x)/u) >> 2); 
    return x; 
} 

다음이 오름차순으로 숫자를 생성 1- 동일한 수의 비트를 포함한 모든 비트를 반복 paterns 보이는 비트 해킹 트릭. 이전 값을 취하여 같은 값의 1 비트로 다음 값으로 변환합니다. 이것은 당신이 단지 크거나 a 같다 최소 비트 조합에서 시작하고 b보다 큰 값이 발생할 때까지 반복 할 필요가 있다는 것을 의미한다.

물론이 양식에서는 abunsigned의 범위 내에있는 경우에만 작동합니다.

+0

이'-' 서명에 영향을주지 않습니다도 좋다. –

+0

값이 증가하는 순서로 반복되도록 보장됩니까? –

+0

@ Yves Daoust :이 코드는 C 또는 C++입니다. 그리고 네, C와 C++에서 unary'-'는'unsigned'에 효과가 있습니다. – AnT

1

이 번호 양식 m > n

2^m + 2^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)이다.

관련 문제