본문 바로가기

C Language/Programming Course

2장 연산자(6부 포인터 연산자와 구조체 연산자, 비트 연산자와 논리 연산자) 첫번째 시간


   

2장 연산자

6부 포인터 연산자와 구조체 연산자,
비트 연산자와 논리 연산자


   
    이번시간에는 많은 연산자가 있습니다. 하지만 이 연산자들 중에서
    일단 포인터 연산자와 구조체 연산자는 아주 간단하게
    설명을 할 것입니다.
    왜냐하면 두개 다 뒤에서 배우는 포인터와 배열, 구조체에서
    사용하는 연산자이기 때문에 여기에서 다루게 되면 이해하기가 어렵기 때문에
    여기서는 간단하게 다루고 넘어 가겠습니다. 
    이해가 안되시더라도 "그냥 그런거구나" 라고 생각만 하시면 됩니다. 
    먼저 포인터 연산자에 대해서 간단히 보면 포인터 연산자는
    *, &, [] 세개가 존재 합니다.

    & 연산자는 앞에 입출력에서 나온 주소를 나타낼때 사용 하는 것입니다. 
    즉,
    int a;
    를 선언하고
    출력에 
    printf("%d", &a);
    라고 한다면 a가 가지고 있는 주소 값이 출력 됩니다. 
    
    *은 나중에 배울 포인터에서 배우는 것입니다. 
    간단하게 포인터 변수는 다른 변수의 주소를 가지는 변수라고만
    알고 계시면 될 것 같습니다.

    그리고 []은 배열에서 쓰는 기호인데 방을 이동할때 쓰는 방번호라고
    만 기억 하시면 됩니다.

    여기에서 포인터, 배열이라는 말도 모르시는 분들도 계실껀데
    그럼 분들은 그냥 무시하시고 넘어가셔도 될 것입니다. 

    그럼 이제 본론적으로 비트 연산자와 논리 연산자에 대해서 알아
    보겠습니다.
    비트 연산자와 논리 연산자는 거의 같은 것이라 같이 설명 하게 되었습니다.
   
    어떻게 보면 알아 듣기 쉬울 수도 있지만, 어떻게 보면 헷갈릴수도 있습니다.
    
    일단 비트 연산자를 먼저 알아 보겠습니다. 
    비트라는 것은 저번시간에 참과 거짓에 이야기 한 적이 있을 것입니다. 
    이때 비트의 개념을 이야기 한 것 인데 
    비트를 정의 하면
    비트는 컴퓨터 데이터의 가장 작은 단위입니다.
    즉 1비트는 값을 0과 1만을 가지고 있습니다. 
    그럼 비트연산자는 이 단위들 가지고 연산을 하는 것이라고 말할 수 있겠죠!?
    그럼 어떤 연산의 종류를 보면 AND, OR, SHIFT, NOT, XOR이 있습니다.
    AND, OR, SHIFT, NOT, XOR 이라는 것을 모르시는 분이라면, 잠시 이 강좌를
    덮고, 이 뜻을 한번 찾아보시길 바랍니다.
    여기에서는 이 것을 안다는 가정 하에 강의를 나아가겠습니다.

    간단하게 설명을 하자면
   
    AND : 둘다 참이면 참이다.
    OR : 둘중 하나라도 참이면 참이다.
    SHIFT : right은 오른쪽으로 한칸씩 이동,  left는 왼쪽으로 한칸씩 이동
    NOT : 참이면 거짓으로, 거짓이면, 참으로 바꾸기
    XOR : 두개의 값이 다르면 참 같으면 거짓
   
    이것을 뜻하는 겁니다.
    위에 나타낸 것을 기호화 시킨것이 바로 비트 연산자 입니다.
    그럼 대칭을 한번 시켜 보겠습니다.
   
    AND => &
    OR => |
    RIGHT_SHIFT => >>
    LEFT_SHIFT => <<
    NOT => ~
    XOR => ^

    입니다. 이 연산들이 모두 비트 연산 입니다.
    그럼 이 연산자를 가지고 연산을 하는 것을 코드가 아닌

    수학적으로 나타내 보겠습니다.

    예를 들어 비트로 연산을 한다고 하면
    일단 비트는 이진수로 나타내야 되기 때문에

    예를 들 숫자를 6, 4로 설명을 하겠습니다.   

    6은 0110 입니다.
    그리고 4는 0100 입니다.

    비트 연산자를 쓰면

    0110 AND 0100 => 0100
    0110 OR 0100 => 0110
    NOT 0100 => 1011
    0110 RIGHT_SHIFT 1 => 0011
    0110 LEFT_SHIFT 1 =>1100
    0110 XOR 0100 => 0010

    이런 결과가 나오게 됩니다.
    이 연산들을 기호로 나타나게 되면

    0110 & 0100 => 0100
    0110 | 0100 => 0110
    ~0100 => 1011
    0110 >> 1 => 0011
    0110 << 1 =>1100
    0110 ^ 0100 => 0010

    그리고 이 이진수를 10진수로 바꾼다면

    6 & 4 => 4
    6 | 4 => 6
    ~4 => 11
    6 >> 1 => 3
    6 << 1 => 12
    6 ^ 4 => 2

    이렇게 되게 됩니다.

    3가지 형태로 보여줬는데 이해가 되셨는지 모르겠네요. 일단
    위의 예는 그냥 이렇게 연산이 되는 구나 라고만 이해 하시면 됩니다.

    이렇게 수학적 기호로 나타내는 것을 c언어 소스에서도
    그대로 사용을 하시면 됩니다.

    int a = 6;
    int b = 4;
   
    printf("%d", a & b);
    printf("%d", a | b);
    printf("%d", a ^ b);
    printf("%d", ~a);

    이런식으로 사용을 하실수 있답니다.

    그럼 논리 연산을 보겠습니다.
    논리 연산은 비트 연산과 비슷하지만 비트연산은 위 처럼 결과가 나타나게 됩니다. 
    하지만
   논리 연산의 결과는 관계연산과 같이 1과 0으로만 출력이 됩니다.
   그리고 연산은 비트 연산의 AND, OR, NOT의 연산을 사용하게 됩니다.
   
    하지만 비트 연산과의 차이를 두기 위해

    AND => &&
    OR => ||
    NOT => !

    이것을 사용하게 됩니다.
    그리고 이 연산은 그냥 사용을 하는 것이 아니라 거의
    관계연산자와 함께 사용이 됩니다.

    그럼 예제로 설명을 드리면

    int a = 6;
    int b = 4;
   
    printf("%d", (a == 6) && (b == 4));
    printf("%d", (a == 6) || (b != 4));
    printf("%d", !(a == 6));

    이렇게 예가 입니다. 해석을 하자면
    a가 6과 같으면서 b가 4와 같으면 1을 출력 아니면 0을 출력
    a가 6과 같으면서 b가 4와 같거나 1을 출력 아니면 0을 출력
    a가 6과 같으면 1을 출력 아니면 0을 출력의 반대

    즉 관계연산의 결과를 가지고 비트연산을 한다고 생각하시면 됩니다.

    결과는
    1, 1, 0이 나오게 됩니다. 

    이번시간에도 역시나 기본적으로 수학 시간에 배운 내용이라
    수학과 연관을 지어서 설명을 하게 되었습니다. 
    설명이 부족하다고 생각이 되면 댓글을 달아 주시면 
    부족한 부분을 다시 올리도록 하겠습니다.
    
    다음 시간에는 삼항 조건연산자, 캐스트 연산자, 괄호 연산자에 대해서 배우겠습니다.

    
비트 연산과 논리 연산을 사용한 예제
===========================================   
    #include <stdio.h>
   
    int main()
    {
        int integer1 = 5;
        int integer2 = 6;
        int integer3 = 7;
        int integer4 = 8;

       
        printf("결과 : %d\n", integer1 & integer2);
        printf("결과 : %d\n", integer1 | integer2);
        printf("결과 : %d\n", integer1 ^ integer2);
        printf("결과 : %d\n", integer1 >> 1);
        printf("결과 : %d\n", integer1 << 1);
        printf("결과 : %d\n", ~integer1);
        printf("결과 : %d\n", (integer3 == 7) && (integer4 == 5));
        printf("결과 : %d\n", (integer3 == 7) || (integer4 == 5));
        printf("결과 : %d\n", !(integer3 == 7));
        return 0;
    }
===========================================