ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 비트 연산
    헷갈렸던것 2022. 1. 21. 17:29
    728x90

    비트 연산은 메모리를 절약할 수 있다는 장점이 있습니다.

    비트 연산을 할 때 주의해야할 점은 부호 입니다.

    unsigned char a = 131; //1000 0011
    char b = -125;         //1000 0011
    
    unsigned char aa;
    char bb;
    
    aa = a >> 5;
    bb = b >> 5;
    
    cout << (int)aa; // 4 (0000 0100)
    cout << (int)bb; //-4 (1111 1100)

    char 형은 1bye , 즉 8bit 입니다.

    unsigned char 형은 부호가 없는 변수 입니다.

    일반적인 변수(char, int , long long 등등) 들은 다 signed형입니다. 따라서 MST의 0과1에 따라 부호가 바뀝니다.

    unsigned char 131(1000 0011) >> 5 = 4(0000 0100) 입니다.

    char -125 (1000 0011) >> 5 = -4 (1111 1100) signed 숫자에서 bit를 옮길때 비는 공간은 그 수의 부호로 채웁니다.

    따라서 남은 bit들은 다 1로 채웠습니다.

    컴퓨터는 음수를 표현할 때 2's complement 방식을 사용하므로 

    1111 1100 -> 0000 0011 -> 0000 0100(4) 가 나오고 부호를 붙여주면 -4가 됩니다.


    << 연산

    보시는것과 같이 비트를 왼쪽으로 옮겨주는 연산입니다.

    예를 들어 3은 컴퓨터 내부에서 2진수로 0011라고 인식합니다.

    여기서 3<<1 이란 의미는 0011 에서 모든 bit를 왼쪽으로 1칸 이동하라는 의미입니다.

    따라서 0110 즉, 6이 됩니다.

    int a = 3;
    cout << (a << 3);

    다음과 같은 코드에서 출력을 해보면 24가 나옵니다.

    <<는 2의 거듭제곱의 곱으로 이해할 수 있습니다.

    3 << 3 = 3 * 2^3 과 같은 의미입니다.

     

    >> 연산

    <<연산과 완전히 반대입니다. 말그대로 모든 bit를 오른쪽으로 옮겨 줍니다.

    6(0110) >>1 = 3(0011) 입니다.

    int a = 24;
    cout << (a >> 3);

    >>는 2의 거듭제곱의 나눗셈으로 이해할 수 있습니다.

    24 << 3 = 24 / 2^3 과 같은 의미입니다.

     

    & 연산 (AND)

    AND연산을 하는 연산자 입니다.

    0 & 0 = 0

    0 & 1 = 0

    1 & 0 = 0

    1 & 1 = 1

    int a = 8; //1000
    int b = 4; //0100
    cout << (a & b); //0000

    최종적으로 0을 출력하게 됩니다.

     

    | 연산 (OR)

    OR 연산을 하는 연산자 입니다.

    0 | 0 = 0

    0 | 1 = 1

    1 | 0 = 1

    1 | 1 = 1

    int a = 5; //0101
    int b = 4; //0100
    cout << (a | b); //0101

    최종적으로 5를 출력하게 됩니다.

     

    ^ 연산 (XOR)

    0 ^ 0 = 0

    0 ^ 1 = 1

    1 ^ 0 = 1

    1 ^ 1 = 0

    int a = 1; //0001
    int b = 3; //0011
    cout << (a ^ b); //0010

    최종적으로 2를 출력하게 됩니다.

     

    ~ 연산 (NOT)

    말 그대로 모든 BIT를 반대로 하는 연산입니다.

    unsigned char num1 = 162;    // 162: 1010 0010
    unsigned char num2;
    
    num2 = ~num1;
    
    cout << num2; //93 : 0101 1101

     

    '헷갈렸던것' 카테고리의 다른 글

    삼항조건연산자  (0) 2021.09.27
    버퍼(buffer) c/c++  (0) 2021.09.07
    실수형 (부동 소수점)  (0) 2021.09.03
Designed by Tistory.