은 정확히 두 개가있는 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
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
보다 큰 값이 발생할 때까지 반복 할 필요가 있다는 것을 의미한다.
물론이 양식에서는 a
및 b
이 unsigned
의 범위 내에있는 경우에만 작동합니다.
이'-' 서명에 영향을주지 않습니다도 좋다. –
값이 증가하는 순서로 반복되도록 보장됩니까? –
@ Yves Daoust :이 코드는 C 또는 C++입니다. 그리고 네, C와 C++에서 unary'-'는'unsigned'에 효과가 있습니다. – AnT
이 번호 양식 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)
이다.
C 또는 Javascript와 같은 기본 언어가 있습니까? –
C 또는 Java하지만, 의사는 – Davide