• 2022. 4. 29.

    by. 데브촙

    반응형

    비트 연산 표

    비트 단위로 AND, OR, NOT, XOR(Exclusive OR) 연산을 수행

    AND 연산 : A, B 값이 둘 다 1이어야 연산의 결과가 1

    OR 연산 : A, B 값이 둘 다 0인 경우에만 연산의 결과가 0

    XOR : 현재 비트 패턴이 반전( 0이면 1, 이면 0). 배타적 논리합

    NOT : 해당 비트가 0 이면 1, 1이면 0으로 바꿔주는 연산

     

    AND 연산 : A & B

    A 비트의 값이 0이면 B 비트의 값에 상관없이 0

    A 비트의 값이 1이면 B 비트의 값에 따라 0 또는 1

    A B 의 비트 값이 모두 1일 때만 1

    OR 연산 : A | B

    A 비트의 값이 0이면 B 비트의 값에 따라 0 또는 1

    A 비트의 값이 1이면 B 비트의 값에 상관없이 1

    A B 의 비트 값이 하나라도 1이면 1

    XOR 연산 : A ^ B

    연산하는 두 비트의 값이 같으면 0, 다르면 1

    A, B의 비트 값이 서로 다른 값일 때 1

    NOT 연산 : ~A

    각 비트의 값을 반전시키는 작업을 수행

    비트가 0이면 1, 1이면 0으로 반전

    비트 연산자 단축 표현

    단축 표현에 사용된 연산자들은 연산자 우선순위가 낮기 때문에 다른 연산자와 연산할 때 연산자 우선순위에 주의해야한다.

    // 기본 표현
    A = A & B;
    A = A | B;
    A = A ^ B
    
    // 단축 표현
    A &= B;
    A |= B;
    A ^= B;
     

    비트 단위로 데이터를 다루는 방법

    비트 연산자는 최소 1바이트(8비트) 단위로 연산

    특정 비트에만 값을 대입하는 연산자는 없음.

    비트 연산자의 특성을 이용하여 개발자가 지정한 비트만 연산하도록 직접 구현해야함.


    지정한 비트를 0으로 설정하기 : AND 연산자 이용

    1단계 : 2번 비트(특정 비트)0으로 설정하기

    비트 AND 연산의 특징(연산하는 비트 중 하나라도 0이면 결과가 0)을 이용

    기존 값을 유지해야하는 비트는 1AND 연산

    값을 0으로 설정해야하는 비트는 0AND 연산

    unsigned char lamp_state; // lamp_state에 어떤 값이 있는지 알 수 없음
    lamp_state = lamp_state & 0xFB;

     

    2단계 : 임의의 비트를 0으로 설정하기

    8개의 비트 중 임의의 비트를 0으로 설정하기 위한 피연산자 상수 만들기

    unsigned char lamp_state;	// lamp_state에 어떤 값이 있는지 알 수 없음
    unsigned char bit_num = 2;	// 0으로 만들 비트의 번호
    unsigned char mask = ~(0x01 << bitnum);	// 0xFB
    lamp_state = lamp_state & mask;	// 0으로 만들 비트의 번호
     

    3단계 : 함수로 만들어보기

    8개의 비트 중 임의의 비트를 0으로 설정하기 위한 피연산자 상수 만들기

    #include <stdio.h>
    
    unsigned char ResetBit(unsigned char dest_data, unsigned char bitnum)
    {
    	// 1바이트 변수라서 비트 이동은 0~7까지 가능함
    	if(bit_num < 8) dest_data = dest_data & ~(0x01 << bit_num); // AND 연산자
    	return dest_data;
    }
    
    void main()
    {
    	unsigned char lamp_state = 0x77; // 2진수: 0111 0111
    	printf(“%X->”, lamp_state);
    	lamp_state = SetBit(lamp_state, 3);//  2진수: 0111 1111
    	printf(“%X\n”, lamp_state;
    }
    
    // 함수 실행결과
    7F->77

    지정한 비트를 1로 설정하기 : OR 연산자 이용

    1단계 : 2번 비트(특정 비트)1로 설정하기

    비트 OR 연산의 특징(연산하는 비트 중 하나라도 1이면 결과가 1)을 이용

    기존 값을 유지해야 하는 비트는 0OR 연산

    값을 1로 설정해야하는 비트는 1OR 연산

    unsigned char lamp_state; // lamp_state에 어떤 값이 있는지 알 수 없음
    lamp_state = lamp_state & 0x04; // lamp_state의 2번 비트만 1로 변경

     

    2단계: 임의의 비트를 1로 설정하기

    8개의 비트 중 임의의 비트를 1로 설정하기 위한 피연산자 상수 만들기

     
    unsigned char lamp_state; // lamp_state에 어떤 값이 있는지 알 수 없음
    unsigned char bit_num = 2;
    unsgiend char mask = 0x01 << bit_num; // bit_num: 0x04
    lamp_state = lamp_state & mask; // lamp_state의 2번 비트만 1로 변경​
     
     

    3단계 : 함수로 만들어보기

    #include <stdio.h>
    
    unsigned char SetBit(unsigned char dest_data, unsigned char bitnum)
    {
    	// 1바이트 변수라서 비트 이동은 0~7까지 가능함
    	if(bit_num < 8) dest_data = dest_data | ~(0x01 << bit_num); // OR 연산자
    	return dest_data;
    }
    
    void main()
    {
    	unsigned char lamp_state = 0x7F; // 2진수: 0111 1111
    	printf(“%X->”, lamp_state);
    	lamp_state = ResetBit(lamp_state, 3);//  2진수: 0111 0111
    	printf(“%X\n”, lamp_state;
    }
    
    // 함수 실행결과
    7F->77

     


     

    특정 비트의 값 얻기 : AND 연산자 이용

    1단계 : 2번 비트(특정 비트)의 값 얻기

    연산하는 한쪽 비트가 1일 때, 다른 쪽 비트 값이 1이면 1, 0이면 0이 나오는 AND 연산의 특징을 이용

    얻고 싶은 번호의 비트만 1로 두고 나머지는 0을 넣어 AND 연산

     

     

    2번 비트의 값을 0 또는 1로 얻기 위해 2번 비트 값을 0번 비트로 이동

    unsigned char lamp_state;	// lamp_state에 어떤 값이 있는지 알 수 없음
    unsigned char bit_state;	// 비트 값을 저장할 변수
    bit_state = lamp_state & 0x04;	// lamp_state의 2번 비트만 값을 유지한 상태로 bit_state에 저장
    bit_state = bit_state >> 2;	// bit_state를 통해 2번 비트의 값을 0, 1로 확인 가능

     

     

    2단계 : 임의의 비트값 얻기

    8개의 비트 중 임의의 비트 값을 얻기 위한 피연산자 상수 만들기

    unsigned char lamp_state;	// lamp_state에 어떤 값이 있는지 알 수 없음
    unsigned char bit_num = 2;	// 1로 만들 비트의 번호
    unsigned char bit_state;	// 비트 값을 저장할 변수
    unsigned char mask = 0x01 << bit_num;	// 비트 이동 후 값은 0x04
    bit_state = lamp_state & mask;	// lamp_state의 2번 비트만 값을 유지한 상태로 bit_state에 저장
    bit_state = bit_state >> bit_num;	// bit_state를 통해 bit_num번 비트의 값을 0, 1로 확인 가능

     

    3단계 : 함수로 만들어보기

    #include <stdio.h>
    
    unsigned char GetBit(unsigned char dest_data, unsigned char bitnum)
    {
    	unsigned char bit_state = 0;
    	if(bit_num < 8) 
    	{
    		bit_state = dest_data & (0x01 << bit_num);
    		bit_state = bit_state >> bit_num;
    	}
    	return bit_state;
    }
    
    void main()
    {
    	unsigned char lamp_state = 0x75, bit_state;
    	printf(“%X->”, lamp_state);
    	for( int i = 0; i < 8; i++)
    	{
    		bit_state = GetBit(lamp_state, 7-i); // 비트를 표시할 때 최상위 비트(7번)부터 순차적으로 표시하기 위해 내림차순으로 비트값을 얻음
    		printf(“%d”,bit_state);
    	}
    	printf(“\n”);
    }
    
    // 함수 실행결과
    75 -> 01110101

     

     


    비트 연산자를 활용하는 방법 보수를 이용해 덧셈으로 뺄셈 구현하기

    부호를 고려하지 않는 1바이트 메모리는 255보다 더 큰 값을 저장하면 오버플로가 발생하여 값을 잃는다.

    unsigned char data = 255;
    data++; // 256이 되어야하지만 오버플로가 발생하여 0이 됨
    data++; // 0이 되었으므로 이 명령문에서 1이 저장됨

    메모리의 특성을 이용하여 data 변수에 들어가는 값을 0으로 만드는 방법(data 변수 값이 255라고 가정)

      1. 255를 뺀다. (data 변수 값과 동일한 값을 뺌) 255 255 = 0

      2. 1을 더한다. (data 변수값이 256이 되는 값을 더함) 255 + 1 = 0

     

    B2의 보수를 더한 것과 B를 뺀 것은 동일함

    덧셈으로 뺄셈을 구현할 수 있음

    이 개념 때문에 컴퓨터에 뺄셈 회로가 없음

     


    비트 연산자를 활용하는 방법 데이터 암호화하기

    비트 XOR 연산의 특성(비트 값이 서로 같으면 0, 다르면 1)을 이용

    특정 값에 동일한 피연산자로 XOR 연산을 두 번하면 원래 값이 나온다.

    반응형

    'C' 카테고리의 다른 글

    지역변수와 전역변수  (0) 2022.04.30
    비트 단위 연산자와 비트패턴  (0) 2022.04.28
    중첩 반복문(2중 for문), break, continue, 기타 반복문  (0) 2022.04.27