• 2022. 4. 28.

    by. 데브촙

    반응형

    0과 1

    1 비트에 0 또는1 중 한 가지 값을 저장 가능

    C 언어의 가장 작은 자료형은 1 Byte.

    40개의 전등의 상태를 저장해야한다면, 40개의 변수가 필요

    1바이트에 8개의 전등 상태를 비트로 저장 가능하기 때문에 5개의 변수로 40개의 전등 상태 저장 가능

    unsigned char lamp_state = 0; // 기본값은 전등이 꺼져있음
    lamp_state = 1;

     

    비트 패턴과 16진법

    C언어는 2진법 상수 표현을 제공하지 않음

    2진법 대신에 소스 코드에서는 표현하기 쉬운 16진법을 주로 사용
    2진법<->16진법 게시글 링크

     

    // 부호 없는 1바이트 data 변수를 선언하고 그 변수에 16진수 값 5A로 초기화
    unsigned char data = 0x5A // 2진법 비트패턴: 0101 1010

     

    시프트 연산자

    변수의 값을 지정한 비트 수만큼 왼쪽(<<) 또는 오른쪽(>>)으로 비트 이동

    오버플로(Overflow) : 비트가 왼쪽으로 밀려나가면서 사라지는 것

    언더플로(Underflow) : 비트가 오른쪽으로 밀려나면서 사라지는 것

    // 오른쪽에서 왼쪽으로 비트 이동
    unsgined char data = 0x1A;	// 이동 전 : 0001 1010
    data = data << 2;		// 이동 후 : 0110 1000 새로채워지는 부분은 0으로 채워진다.
    // 왼쪽에서 오른쪽으로 비트 이동
    unsgined char data = 0x1A;	// 이동 전 : 0001 1010
    data = data >> 2;		// 이동 후 : 0000 0110 새로채워지는 부분은 0으로, 밀려난 부분은 없어진다.(Underflow)

     

     

    시프트 연산자의 특성 이용하기

    << 특성 : n 개의 비트를 오른쪽에서 왼쪽으로 이동하면 2n승을 곱한것과 동일

    >> 특성 : n 개의 비트를 왼쪽에서 오른쪽으로 이동하면 2n승을 나눈것과 동일

    시프트 연산자는 곱셈과 나눗셈 연산자보다 연산 속도가 빠름

    2의 제곱으로 곱하거나 나눌 때에만 시프트 연산자 사용 가능

    시프트 연산자를 사용할 때 주의할 점

    1) 연산자 우선 순위가 낮다.

    int number = 3 * 4 + 5 * 8;
    // 위 식을 시프트 연산자로 대체
    int number = 3 << 2 + 5 << 3; // +가 <<보다 연산자 우선순위가 높기 때문에 2+5가 먼저 연산됨
    int number = 3 << 7 << 3;
    
    int number = (3 << 2) +( 5 << 3); // 이렇게 괄호를 활용해야 정확하게 연산 가능

    2) 변수에 부호가 있는 경우

    unsigned 형식으로 선언된 변수들은 시프트 연산 시 빈 공간을 0으로 채움

    signed 형식으로 선언된 변수들에 >>를 사용하면 자신의 부호를 유지하기 위해 부호 비트와 동일한 값을 채움

    char data = 0x85; // 10진수 –123
    data = data >> 3;

    부호를 유지하기 때문에, 그로 인해 부호 비트가 1이면 나머지 밀리는 값도 1로 처리됨.
     
     

    음수를 나누는 경우에는 >> 연산자보다 /를 사용하여 나누는 것이 좋음.

    int num = -123 / 8;	// num 변수에 –15가 대입
    int num = -123 >> 3;	// num 변수에 –16 대입  -123이 8의 배수가 아니기 때문에 1만큼 차이가 발생한 것.

     

    2의 제곱이 아닌 숫자도 시프트 연산으로 대체할 수 있을까?

    100 = 64(2^6) + 32(2^5) + 4(2^2)

    a * 100 = a * 64(2^6) + 32(2^5) + 4(2^2)

    = a * 64 + a * 32 + a * 4

    = a * 2^6 + a * 2^5 + a * 2^2

    = a << 6 + a << 5 + a << 2 (연산자 우선순위)

    = (a << 6) + (a << 5) + (a << 2)

     
    반응형

    'C' 카테고리의 다른 글

    비트 연산자(AND, OR, XOR, NOT)  (0) 2022.04.29
    중첩 반복문(2중 for문), break, continue, 기타 반복문  (0) 2022.04.27
    while 반복문  (0) 2022.04.26