[TIL] ㄹㅈㄷ C 논리연산

zxcv·2025년 5월 23일
post-thumbnail

CSAPP 책 읽던 중 bit연산 하는 이유 ㄹㅈㄷ핵심 발견

#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에 대입하는 것이고, 반대또한 마찬가지.

포인터 변수 자체 주소값에 변동이 없음

Q. hex,binary로 보면 주소값이 일치하는 부분이 있는데 일치하는 부분에 대해서는 왜 XOR이 진행되지 않는지?

A. 논리연산은 주소값 전체를 하나의 set으로 봄.

예) 주민등록증 홍길동000101, 김아무개000120 생년월일이 비슷하지만 완전히 다른 인물인 것처럼 컴퓨터 논리연산도 이와 같은 개념으로 연산을 수행.

마침 코딩애플이 비슷한 내용 업로드 했음

TMI

메모리 논리(|(or) 연산 해버리기

void inplace_or(int *x) {
    *x = *x | 4; //임시 변수 없이 변환
}

pb 포인터변수에 or연산으로 4를 빼면 b의 주소값에서 a의 주소값을 가지게 될 줄 알았지만 garbage값을 가져온것 같다.

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

profile
일단함

0개의 댓글