반응형

실수하기 쉬운 케이스

1. 일반적으로 for문의 i를 unsigned 변수로 쓰는건 매우 위험하다.

why? 보통 i>=0을 많이 사용하는데, 얘는 0아래로 내려갈 일이 없다. 따라서 무한루프가 발생할 수 있다.

 

2. >>의 나머지는 버림이라고 생각하기 쉽지만, >>는 음수일 경우 올림이다. (-1.5가 값이면 -2로 만듬)

why? 음수는 비트 1이 사라지는 것이 +1이 사라지는 것이기 때문에, -1.5로인해 버려진 비트가 값을 올린다.

 

3. 음수를 양수로 단순하게 만드는 것은 항상 가능한 것이 아니다. 

why? 모든 자료형에서 음수의 범위가 양수의 범위보다 1 높다. ( int의 경우 양수는 2^31-1까지만 표현되지만, 음수는 -2^31까지 표현이 가능) 따라서 항상 가장 작은 수를 주의할 필요가 있다.

이로인해 ~x +x = -1은 대부분 참이지만, 가장 작은 음수에게는 적용되지 않는다.

 

4. 일반적인 비트연산의 오류는 가장작은 음수,  Unsigned의 가장 큰 양수, overflow, bit개수, 음수의 나머지에서 발생한다.

why? 가장작은 음수, Unsigned의 가장 큰 양수는 3번의 오류가 자주 발생, overflow, bit개수는 표현 불가능으로인한 오류, 음수의 나머지의 경우 올린다는 사실을 무시하는 경우다.

 

알아두면 좋은 연산 방법

1. !(!x) 를 사용하면 모든 0이 아닌 수는 1이되고 0은 그대로 0이된다.

 

2. 여러개 bit를 모두 확인해야 할때, 그룹을 통해서 확인후 그들을 더하는 방법이 유용하다. (32개bit의 경우, 각 byte의 첫자리에만 1을 둔 int숫자와 원하는 숫자를 shift연산을 통해 연산한뒤, 4개의 자리만 확인하는 방법이 있다.)

 

3. ~x+1은 양수와 음수를 바꾸는 방법이기도 하지만, (~x+1)&x를 활용하면 첫 1의 자리를 알아낼 수 있다.

 

4. int의 경우 x>>31을 하면 음수는 -1, 0을 포함한 양수는 0이 나온다. (부호 관련 bit 연산 자주나옴)

 

5. 음수에 대한 나누기를 진행할때 >>연산을 커버치기 위해서는 shift로 사라진 부분에 1이 있는지 확인하고 1을 더할 필요가 있을 수 있다. 

 

반응형

+ Recent posts