제목을 번역하는게 참 애매해서 영어도 같이 써놨습니다.
5 (101) 를 예로 들면
다음 큰 수는 6이고 (110)
이전 작은 수는 3이 됩니다. (11)
Next higher number with same number of binary bits set
View more PowerPoint from GowriKumar Chandramouli
알고리즘 설명은 따로 안하겠습니다.
위의 프리젠테이션을 보시면 이해하실 수 있습니다.
저 프리젠테이션에 추가적으로 내용을 덧붙이자면
x의 Next Higher Number를 구하는 함수를
snoob(x)라고하면
x의 Next Lower Number는 ~snoob(~x) 를 쓰면 나옵니다.
(단, 1,3,7,15,31 과 같이 구할 수 없는 수 같은 경우는 -1이 나오게 됩니다.)
그리고 프리젠테이션에 나온 함수를
줄여 쓰고 싶다면 다음과 같이 쓸 수 있습니다.
template<typename _T>
_T snoob(_T x)
{
return (x+(x&-x))|(((x^(x+(x&-x)))>>2)/(x&-x));
}
'C/C++ > 비트/쉬프트' 카테고리의 다른 글
두 정수의 부호가 다름을 판별 (0) | 2012.09.02 |
---|---|
Integer의 부호 판별 (0) | 2012.09.02 |
추가 메모리 없이 두 정수 교환하기(Integer Swap) (0) | 2012.06.01 |
int형 변수에서 1인 비트수(비트개수) 구하기 (0) | 2011.11.12 |
Double Dabble(Shift and add 3) Algorithm (2) | 2011.09.30 |