chaeeun24   2년 전

이제 막 코딩을 시작해서 다른 분들의 코드를 보며 익히고 있는데요

본 문제 숏코딩을 보니 

main(x,y){scanf("%d%d",&x,&y);putchar(51+(~y>>10^x>0));}

이렇게 푸신 분들이 계시더라고요

putchar(51+(~y>>10^x>0) 

이 부분이 어떤 원리로 도출됐는지 궁금합니다. 구글링을 해봤는데도 별다른 해답을 얻지 못했네요.

답변 부탁드립니다.

artichoke42   2년 전

 우선 연산자 우선순위를 알아보니 ~연산자, >>연산자, >연산자, ^연산자 순으로 실행되는 것 같습니다. 즉, ((~y)>>10)^(x>0) 순으로 계산됩니다.

이제 또 각 부분을 살펴보면..

 1. ~y

 ~ 연산자는 bitwise not 연산자, 즉 y의 모든 bit를 뒤집습니다. 예를들어 y가 2(0b0000 0000 0000 0000 0000 0000 0000 0010)이라면 -3(0b1111 1111 1111 1111 1111 1111 1111 1101)이 되는 식입니다. (왜 저게 -3인지 이해가 가지 않으시다면 구글에 '2의 보수'를 검색해보세요)

 2. (~y)>>10

 >>연산자는 (~y)의 비트를 10칸만큼 미는 역할을 합니다. 즉 3>>1은 1 (0b11 -> 0b1)이 되는 식입니다. 이때 y의 절댓값은 2^10보다 작기 때문에, y가 양의 정수라면 해당 연산 이후 -1(모든 bit가 1), 음의 정수라면 0(모든 bit가 0)이 됩니다.

 3. x>0

 x가 0보다 크면 1, 작거나 같으면 0입니다. 이 부분은 아실 것 같으니 자세한 설명은 생략하겠습니다.

 4. ((~y)>>10)^(x>0)

 우선 ^연산자는 bitwise xor입니다. 해당 연산자는 두 수의 각 자리수(2진법 기준)에 대해 각 비트가 같으면 0, 다르면 1이 됩니다. 즉, 2^3은 1(0b10 ^ 0b11 = 0b01)이 되는 식입니다. x와 y가 모두 양수라면 1, 2번 연산결과는 -1, 3번 연산결과는 1이 되어 -1^1=-2가 되고, x는 음수 y가 양수라면 -1^0=-1, x, y 둘다 음수라면 0^0=0, y만 음수라면 0^1=1이 되고, 마지막으로 이 결과를 51에 더하면 각각 49, 50, 51, 52가 되는데, 아스키코드로 나타내면 각각 '1', '2', '3', '4'가 됩니다.

댓글을 작성하려면 로그인해야 합니다.