C언어를 공부한 사람이라면 call by value 예제로 지겹게 보게 되는 다음 함수를 기억할 것이다.
void swap(int *x, int *y) {
}
보통 이 함수는
void swap(int *x, int *y) {
int t = *x;
*x = *y;
*y = *x;
}
이렇게 코딩되고 변수 선언 없이 하라고 할 경우에는,
void swap(int *x, int *y) {
*x ^= *y;
*y ^= *x;
*x ^= *y;
}
이렇게 코딩할 수 있다.
그렇다면, 세 문장이 아닌 두 문장으로 변수 교환이 가능한가?
단, 콤마(,) 연산자는 사용할 수 없다.
가능했는가? 쉽다고 생각했으면 1문장짜리 코드도 만들어보라. [난이도 ★★★☆☆]
*x ^= *y ^= *x ^= *y;이걸물어본건 아닐테고..
AC 제가 문제에서 답을 줘 버렸네요 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
설마... 했는데
*x -= (*y -= *x += *y) *= -1;
한줄로 줄였음 ~_~
저 코드를 1바이트로 압축시킬수 있는가? #define void swap(int *x, int *y) { *x ^= *y; *y ^= *x; *x ^= *y; }
나 참. 너무 쉬운걸 묻네.
아니 애초에 밑에것도 충격이네 원리가 모임?
원리가 궁금하면 벤다이어 그램이라도 그려보든지 : ) a xor b 라는건 a b 의 합집합에서 교집합을 뺀 상태라 다른 한 집합와 xor 할때 반대편이 나오게 된다.
비트 레벨로 3 5 에 대한 xor 을 그려보면 011 ^ 101 -> 110 (비트 자릿수별 1의 합성에서 공통이 빠짐), 여기에 대해 110 과 ^ 011 을 XOR 하면 3의 상대측인 101 이 나오고 110 에 ^ 101 을 하면 5의 상대측인 3이 나오게 되는거.
이렇게 하면 어떻게 나온다는건 알겠는데 걍 답답함…