C언어 변수 & 연산자 bit 연산자

    2018-02-06 05:38:13 작성

    비트 연산자

    & 비트단위 AND 연산을 한다.
    ex) n1 & n2;
    | 비트단위 OR 연산을 한다.
    ex) n1 | n2;
    ^ 비트단위 XOR 연산을 한다.
    ex) n1 ^ n2;
    ~ 피연산자의 모든 비트를 반전시켜 반환한다.
    ex ) n2 = ~n1;
    n1은 변화 없음
    << 피연산자의 비트열을 왼쪽으로 이동시켜 반환한다.
    ex) n2 = n1 << 2;
    2칸 왼쪽으로 이동 n1은 변화 없음
    >> 피연산자의 비트열을 왼쪽으로 이동시켜 반환한다.
    ex) n2 = n1 >> 3;
    3칸 오른쪽으로 이동 n1은 변화 없음

    & 연산은 두개의 비트가 모두 1일때만 1을 반환한다.

    • 0 & 0 = 0
    • 0 & 1 = 0
    • 1 & 0 = 0
    • 1 & 1 = 1
    #include <stdio.h>
    
    int main(void) {
        int a1 = 15; // 00001111
        int a2 = 20; // 00010100
        int a3 = a1 & a2; // 00000100
        printf("& 비트의 AND 연산 : %d\n", a3);
        return 0;
    }


    | 연산은 두개의 비트중 하나라도 1이면 1을 반환한다.

    • 0 | 0 = 0
    • 0 | 1 = 1
    • 1 | 0 = 1
    • 1 | 1 = 1
    #include <stdio.h>
    
    int main(void) {
        int a1 = 15; // 00001111
        int a2 = 20; // 00010100
        int a3 = a1 | a2; // 00011111
        printf("| 비트의 OR 연산 : %d\n", a3);
        return 0;
    }


    ^ 연산은 두개의 비트가 서로 다를 경우에 1을 반환한다.

    • 0 ^ 0 = 0
    • 0 ^ 1 = 1
    • 1 ^ 0 = 1
    • 1 ^ 1 = 0
    #include <stdio.h>
    
    int main(void) {
        int a1 = 15; // 00001111
        int a2 = 20; // 00010100
        int a3 = a1 ^ a2; // 00011011
        printf("^ 비트의 XOR 연산 : %d\n", a3);
        return 0;
    }


    ~ 연산은 0은 1로 1은 0으로 반전시킨다. 보수연산이라고도 한다.

    • ~ 0 = 1
    • ~ 1 = 0
    #include <stdio.h>
    
    int main(void) {
        int a1 = 15; // 00001111
        int a2 = ~ a1; // 11110000
        printf("~ 비트의  NOT 연산 : %d\n", a2);
        return 0;
    }


    <<, >> 는 비트를 이동(Shift) 시킨다.
    정수에서 <<는 비트를 1 왼쪽으로 이동시킬때 마다 값이 2배가 되고,
    >>는 비트를 1 오른쪽으로 이동시킬때 마다 2로 나누어진다.

    #include <stdio.h>
    
    int main(void) {
        int a1 = 15; // 00001111
    
        int left1 = a1 << 1; // 00011110
        int left2 = a1 << 2; // 00111100
        int left3 = a1 << 3; // 01111000
    
        int b1 = -16;
        int right1 = b1 >> 1; // 11110000
        int right2 = b1 >> 2; // 11111000
        int right3 = b1 >> 3; // 11111100
    
        printf(" 비트의 << 1  연산 : %d\n", left1);
        printf(" 비트의 << 2  연산 : %d\n", left2);
        printf(" 비트의 << 3  연산 : %d\n", left3);
    
        printf(" 비트의 >> 1  연산 : %d\n", right1);
        printf(" 비트의 >> 2  연산 : %d\n", right2);
        printf(" 비트의 >> 3  연산 : %d\n", right3);
        return 0;
    }


    연습문제

    3 × 8 ÷ 4 의 결과를 출력하는 프로그램을 작성하세요.
    단 * 와 / 연산자를 사용하지 말고 bit연산자를 사용하세요.