Programming Problems/Bit manipulations

같은 갯수의 0과 1을 가지는 바로 더 크고 작은 수를 구하자.

fw93 2018. 4. 22. 19:38

10010


>> 다음 숫자 : 10100

     앞 숫자 : 10001


풀이 : 오른쪽에 1이 있는 첫 0과 그 1을 스왑하면 (반대로 얘기하면 바로 옆이 비어있는 첫 1) 다음 숫자이다.



***

오른쪽이 비어있는 첫 1을 그 오른쪽으로 밀면 바로 작은값

왼쪽이 비어있는 첫 1을 그 왼쪽으로 밀면 바로 큰값

01 >> 큰값

10 >> 작은값


pair<int,int> (int n){

// base cases

if(n==0) return pair<int,int>(0,1);

if(n==-1) return pair<int,int>(-2,0);

int m = 1;

int bigger = 0;

int smaller = 0;

int preflag = m&n;

m = m<<1;

for(int i = 1 ; i < 32 ; i++){

if(preflag!=0&&n&m==0){

// bigger found

bigger = n^(m^(m>>1));

}

if(preflag==0&&n&m!=0){

// smaller found

smaller = n^(m^(m>>1));

}

if(smaller!=0&&bigger!=0) break;

}

return pair<int,int>(smaller,bigger);

}


음수


1101 : -3

1110 : -2(큰값)

1011 : -5(작은값) 

성립한다 !!!


완벽한 알고리즘 ..


time complexity O(logN)