시프트 연산 2

비트 연산으로 산술연산 빠르게 처리하기

> n 은 2를 n번 나눈 것이고 위의 것들은 익히 잘 알려져 있고 꽤 쓰이는 듯 하다. 다음으로 2의 n제곱 단위의 수를 나눈 나머지 연산의 경우도 앤드 연산으로 가능하다. i % 2 => i & 1 i % 4 => i & 3 i % 8 => i & 7 i % 16 => i & 15 i % 32 => i & 31 .... i % 2의 n제곱 => i & (2의 n제곱 - 1) 나머지 연산보다는 비트 연산이 비할바 없이 빠르다. 참고로 릴리즈 실행 화일을 올리디버거 사용하여 어셈블리 코드를 뜯어보니 역시나 컴파일러가 저 경우 앤드 연산으로 알아서 최적화 코드를 생성함을 알 수 있었다. 다음으로 xor 연산으로 특정한 경우 뺄셈처리가 가능하다. 가령 32개의 요소가 있는 경우 0 ~ 31까지 인덱스를 역순..

C, C++ 문법 2011.07.24

비트 연산의 이해와 활용

비트연산자에는 다음과 같은 것들이 있다. ~ & | ^ > ~, &, | 연산자의 경우는 사용도가 높고 직관적으로 이해가 잘 된다. 훌륭한 사용예로 윈도우 스타일 변경을 들 수 있다. GetWindowLong, SetWindowLong으로 얻거나 변경이 가능하다. 위 API에서 스타일 결과값이나 인수는 DWORD 형 4바이트로 특정 비트에 각각의 속성을 매칭시키는 식이다. 윈도우 스타일뿐 아니라 소위 각종 속성이나 플래그는 이런 식으로 처리한다. 가령 WS_VISIBLE 속성은 총 32비트 중에 어느 곳을 지정해서 그곳의 비트가 1이면 해당속성을 가진 것으로 인식하는 것이다. 스타일이 4바이트(32비트)면 총 32개 속성을 주는 게 가능하다. 여담으로 이게 부족했던지 CreateWindowEx에서는 첫번..

C, C++ 문법 2011.07.10