프로그래밍 언어/C언어

비트연산 사용법(BIT연산)

원원 2017. 7. 26. 20:30


안녕하세요. 이번에는 BIT연산에 대해 알아보겠습니다. 이 비트연산은 C언어뿐만 아니라 자바,C#등 다양한 언어에서 사용할 수 있는 기능입니다.

특히 MCU를 사용할때 많이 사용하게 됩니다.(아트메가,아두이노 등)

왜냐하면 MCU들은 레지스터로 제어를 하게되는데 레지스터들은 비트로 되어있습니다. 





비트연산 

& (AND연산)

| (OR연산)
^ (XOR연산)

~ (NOT연산)

<< (왼쪽 쉬프트연산)

>> (오른쪽 쉬프트연산)

이렇게 비트연산에는 6가지가 있습니다.






&(AND연산)

진리표

입력1

입력2

출력 

 0 

 0

 1

 1

입력이 모두 1일때만 출력이 1이 됩니다.


5~8번째줄은 실제로 &연산을해서 값을 출력해본것이고 10~15번째줄은 실제로 if문에 사용한 것입니다. a&b를하면 1이므로 True가 됩니다.


|(OR연산)

진리표

 입력1

입력2

출력 

 0 

 0

1

 1

 1

입력 한쪽이 1만되도 출력이 1이 됩니다.



^(XOR연산)

진리표

 입력1

입력2

출력 

 0 

 0

1

 1

 1

0

입력이 다르면 1이되고 같으면 0이 됩니다.



~(NOT연산)

진리표

 입력

출력

 0

1

 1

0

입력과 출력이 반대가 됩니다.



<<(왼쪽 쉬프트연산)

쉬프트연산이 비트연산중에 가장 어려운데요. 생각보다 어렵지 않습니다.

쉬프트연산을 해주면 비트 단위로 움직입니다.

예를들어 9은 2진수로 나타내면 00001001입니다.  

9<<2를 하면 왼쪽으로 2비트 가라는 것입니다.

2진수 00001001에다가 왼쪽으로 2비트가면 2진수 00100100이 되겠네요. 다시 이걸 10진수로 바꾸면 36이 되겠네요..

여기서 주의할점이 이동할때 이동한만큼 비트가 버려지고 0으로 채워집니다.

2의 n승배 만큼 곱해진 것입니다. n=비트이동수

9 * 2의2승 = 36

 <<1

*2 

 <<2

*4 

 <<3

*8 

 <<4

*16 



>>(오른쪽 쉬프트연산)

오른쪽 쉬프트연산은 오른쪽으로 이동하는것 뿐입니다.

9>>2를 한다면

9가 2진수로 00001001이니까  2진수 00000010이 됩니다. 그럼 2가 되겠죠

2의 n승배가 나눈 것 입니다. n=비트이동수

9 /2의2승 = 2(소숫점버림)

>>1

/2 

 >>2

/4 

 >>3

/8 

 >>4

/16 





예시1

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
int main()
{
    int a = 5// 5 = 0b00000101
    int b = 9// 9 = 0b00001001
    int c = 16// 16 = 0b00010000
 
    printf("%d & %d = %d \n", a, b, a&b); //1
    printf("%d | %d = %d \n", a, c, a|c); //21
}
cs



예시2

아트메가에 10비트 ADC라는게 있는데, 아트메가는 8비트를 사용합니다. 그래서 10비트를 표현하기위해서 ADCH와 ADCL에 나누어 담게 됩니다.

ADLAR변수가 0이면 ADCH에있는 ADC9,ADC8가 9번째비트,10번째비트가 됩니다.

1
2
unsigned int a=0;
= ADCL | (ADCH<<8); // a=ADCL+(ADCH*256)
cs


ADLAR변수가 1이면 ADCL에있는 ADC1,ADC0이 2번째비트,1번째비트가 됩니다.

1
2
unsigned int a=0;
= (ADCL>>6| (ADCH<<2);
cs