언타이틀/코드리뷰
비밀번호 @kancho
알 수 없는 사용자
2016. 6. 1. 17:48
문제
#include< iostream > using namespace std; /* 2016-06-01 옥상, 비밀번호:: 시간초과 */ int binari(int n, int check) { int cnt = 0; while (n) { if (check != 0 && check < cnt) return -404; if (n & 1 == 1) cnt++; n = n >> 1; } return cnt; } int down(int n, int bin) { for (int i = n - 1; i > 0; --i) { if (binari(i, bin) == bin) return i; else continue; } return 0; } int up(int n, int bin) { for (int i = n + 1;; ++i) { if (binari(i, bin) == bin) return i; else continue; } } int main() { int A; int bin; cin >> A; bin = binari(A, 0); cout << down(A, bin) << " " << up(A, bin); return 0; }
계속 시간초과 되는 코드만 짜다가
저런 비트연산만으로는 안된다는 걸 깨닫고
구글링을 통해 혁신적인 방법을 알아내었습니다
[아래 참고자료 참조]
A의 Next Higher Number를 구하는 함수는 bitOper라고 할 때
Next Lower Number는 구하는 동작은 같으므로 반대로 해주면 됩니다
~bitOper(~A).
하지만 여기서 더이상 1, 3, 5, 7, 15처럼 최대 비트수에서 이미 1로 채워진 수는 구할 수 없습니다.
그런 Number는 -1이 나옵니다.
#include < iostream > using namespace std; typedef long long BIG; BIG A, B; BIG bitOper(BIG num) { BIG a = num&-num, b = a + num, c = ((num^b) >> 2) / a; return B = (b | c); } int main() { BIG down, up; cin >> A; if (~bitOper(~A) == -1) down = 0; else down = ~B; up = bitOper(A); cout << down << " " << up; return 0; }
참고자료
같은 1 비트를 같는 다음의 수
추가
비트연산, 쉬프트 연산 http://selfc.tistory.com/10
1의 보수, 2의 보수 http://zapiro.tistory.com/entry/컴퓨터의-음수-표현법보수법