ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C Language] 13. 비트 연산자 - C 언어
    CSE/C Language 2015. 6. 13. 10:11

    1. 비트 연산자의 종류

     - 비트 연산자는 모두 여섯 가지가 있으며 아래와 같다.

      ~ : 1의 보수 비트 연산자

      ^ : XOR 비트 연산자

      |  : OR 비트 연산자

      & : AND 비트 연산자

      <<: 왼쪽 시프트 연산자

      >>: 오른쪽 시프트 연산자



    2. ~ 비트 연산자

     '~'는 단항 연산자이기 때문에 하나의 항을 가지며 어떤 수에 '~' 연산자를 사용하면 결과는 1의 보수가 된다.


     사용방법

    변경 전 

    변경 후 

     ~5

    0000 0000 0000 0101 

    1111 1111 1111 1010 

     ~1024

    0000 0100 0000 0000 

    1111 1011 1111 1111 



    3. ^ 비트 연산자

     '^'는 이항 연산자이며 2개의 항을 가진다. 이것은 특정한 비트에 대해 XOR(Exclusive OR)을 수행하는데, 베타적 논리합이라고도 하며 아래와 같은 결과를 낸다.


    5 ^ 7  => 2           

                         0000 0101

                         0000 0111

                         --------------

                         0000 0010


     ^ 비트 연산자는 비교 대상이 되는 두 항의 값이 다를 경우에 1을 반환하고, 같을 경우에는 0을 반환한다.



    4. | 비트 연산자

     '|'는 두 항의 값을 논리합(OR)하여 그 결과를 출력한다.



    5 | 7 => 7

                         0000 0101

                         0000 0111

                         --------------

                         0000 0111



    아래 예제를 통해 다시 살펴보자. 예제는 특정 비트를 1로 설정하는 예제이다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    /*
     * bitset.c
     *
     *  Created on: 2015. 5. 11.
     *      Author: root
     */
     
    #include <stdio.h>
     
    int main(void) {
     
        int bit = 8;        // 0x00001000
        int result;
     
        result = bit | 0x00000001;
        /*
         * 0x00001000
         * 0x00000001
         * ------------
         * 0x00001001
         */
     
        printf("Result is %d\n", result);
     
        return 0;
    }
    cs










    5. & 비트 연산자

     '|' 비트 연산자가 특정한 위치의 비트를 1로 만들 때 유용하다면 '&' 비트 연산자는 반대로 특정한 위치의 비트를 0으로 만들 때 유용하다.



    6. << 비트 연산자

     사용법을 통해 알아보도록 하자. 아래와 같은 명령을 주었다고 하자.

     

     int bitShift = 5;

     bitShift = bitShift << 2;


     맨 처음 변수 선언 시, 아래와 같은 영역을 할당받는다.

     

     00000000 00000000 00000000 00000101


     그 다음 비트 연산을 통해 비트가 '왼쪽으로 2칸' 이동하게 된다. 나머지 부분은 0으로 채워진다.


     00000000 00000000 00000000 00010100


     왼쪽으로 이동하게 되면 2의 N 제곱한 것과 같아진다. 본래 5의 값에 왼쪽으로 2회 이동했기 때문에 5 * 4를 통해 결과는 20이다.



     다음은 예제를 통해 실행을 해보자. 

     예제는 10진수를 입력하여 2진수로 변환하는 예제이다.



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    /*
     * binary.c
     *
     *  Created on: 2015. 5. 11.
     *      Author: root
     */
     
    #include <stdio.h>
     
    int main(void) {
     
        int i;
        int num;
     
        printf("Input primative number");
        scanf("%d", &num);
     
        for (i = 0; i < 32; i++) {
            if (num & 0x80000000)
                putchar('1');
            else
                putchar('0');
     
            num <<= 1;
        }
     
        return 0;
    }
    cs







    7. >> 비트 연산자

     왼쪽 시프트 연산자와 사용 방법은 다르지 않지만, 주의사항이 있으므로 짚고 넘어가도록 하겠다.


     오른쪽 시프트 연산자를 사용할 때 가장 조심해야 할 부분은 '부호있는 피연산자' 즉, 음수일 경우의 주의사항이다.


     이 연산을 음수일 경우에 사용하면, 왼쪽에 채워지는 비트는 0이 아니라 1다.


     아래 예를 통해 보도록 하자.


     5 >> 2                   0000 0101 >> 2     ==>   0000 0010

    -5 >> 2                   1111 1011 >> 2     ==>   1111 1110




    * Programming in C 서적을 참고하여 작성하였습니다 


    댓글

Designed by Tistory.