본문 바로가기

알고리즘

두 수의 부호가 같은지 다른지 확인하는 방법[XOR], C++, 코딩스킬

일반적으로 두 수의 부호가 다르기 위해서, if문을 쓸 수도 있다.

 

물론 이 방법은 너무 쉽기 때문에... 

 

누구든지 생각할 수 있다.

 

만약에 a, b라는 숫자가 있다고 하면,

 

여기서 곱하기로 부호를 체크한다면, overflow가 발생하기 때문에 틀린 방식이다.

 

 

 

따라서, a와 b의 부호를 각각 확인해주는 방식을 사용한다.

 

if((a > 0 && b >0) || (a < 0 && b < 0))

return true;

else 

return false;

 

위와 같은 식으로 코드를 구성할 수도 있다. 

 

 

 

하지만 빠른 코딩대회에서는 이것마저도 시간이 아까울 수 있다...(사실 몇초차이 안난다).

 

보통 코딩을 좀 하시는 분들이라면 다음과 같이 표현한다.

 

 

 

 

retrun (a ^ b) >= 0

 

 

 

처음보면 낯설 수도 있다. 하지만, 익숙해지면 어떤 것보다 간단하다.

 

위에 식은, a와 b를 XOR을 한 것이다. XOR이라고 함은, 

 

이진수 비트를 기준으로

 

 

1 XOR 1 = 0

1 XOR 0 = 1

0 XOR 1 = 1

0 XOR 0 = 0

 

 

즉, 다른 수 일때, X를 표현하게 된다. 자, 그렇다면 이게 부호가 다름을 표현해줄 수 있을까?

 

 

이 것을 파악하기 위해서는, 

 

 

이진수로 음수와 양수가 표현되는 방식을 알아야 한다.

 

 

 

 

32Bit 기준으로 표현이 된다고 가정하면,

 

 

최상위 비트를 제외하곤 나머지는 숫자를 표시하는데 사용된다.

 

 

즉, 최상위 비트가 1이면 음수를 표현하고, 최상위 비트가 0이면 양수를 표현한다.

 

 

따라서, XOR로 부호가 다름을 표현할 수 있게 되는 것이다.

 

 

 

 

 

추가적으로, 왜 양수와 음수의 숫자 범위가 다른것일까?

 

 

최상위 비트가 0이고, 나머지 비트들이 0인 것은 숫자 0으로 표현된다.

 

 

최상위 비트가 1이고, 나머지 비트들이 0인 것은 0이 아니라, -2의31승이 되기 때문에,

 

 

음수의 범위가 양수의 범위보다 하나 더 많은 것이라고 생각하면 된다.