#include <stdio.h>
void inplace_swap(int *x, int *y) {
*y = *x ^ *y; //임시 변수 없이 변환
*x = *y ^ *x;
*x = *x ^ *y;
}
int main() {
int a = 1;
int b = 2;
int *pa = &a;
int *pb = &b;
printf("교환전 값\n");
printf("a 변수 참조: %d\n", *pa); // 교환전 값s 출력
printf("b 변수 참조: %d\n", *pb); // 교환전 값 출력
printf("pa 주소값 : %p\n", (void*)pa); // 주소 출력
printf("pb 주소값 : %p\n", (void*)pb); // 주소 출력
printf("======================\n"); // 교환전 값 출력
inplace_swap(pa, pb);
printf("a 변수 참조: %d\n", *pa); // 값 출력
printf("b 변수 참조: %d\n", *pb); // 값 출력
printf("pa 주소값 : %p\n", (void*)pa); // 주소 출력
printf("pb 주소값 : %p\n", (void*)pb); // 주소 출력
return 0;
}
CSAPP 2.1.7장에는 비트연산에 대해 나옴.
우린 신세대 답게 이걸 왜 쓰는지 모르겠음.
그래서 연습문제에 있는 코드를 printf 해보니
핵심 발견
pa 주소값: 00000000005ffebc
pb 주소값: 00000000005ffeb8

대충 Little endian느낌으로 0부분 짜르고 2진수로 전환하면
pa: 0101 1111 1111 1110 1100 1101
pb: 0101 1111 1111 1110 1100 1000
bit로 치환하면 주소값이 다르기에 XOR연산에 의해
y = x ^ y 는 결국 x를 *y에 대입하는 것이고, 반대또한 마찬가지.
예) 주민등록증 홍길동000101, 김아무개000120 생년월일이 비슷하지만 완전히 다른 인물인 것처럼 컴퓨터 논리연산도 이와 같은 개념으로 연산을 수행.
void inplace_or(int *x) {
*x = *x | 4; //임시 변수 없이 변환
}
pb 포인터변수에 or연산으로 4를 빼면 b의 주소값에서 a의 주소값을 가지게 될 줄 알았지만 garbage값을 가져온것 같다.

포인터는 대입연산자로 바꿔야겠다 ^^