안녕하세요. 이번에는 BIT연산에 대해 알아보겠습니다. 이 비트연산은 C언어뿐만 아니라 자바,C#등 다양한 언어에서 사용할 수 있는 기능입니다.
특히 MCU를 사용할때 많이 사용하게 됩니다.(아트메가,아두이노 등)
왜냐하면 MCU들은 레지스터로 제어를 하게되는데 레지스터들은 비트로 되어있습니다.
비트연산
& (AND연산)
| (OR연산)
^ (XOR연산)
~ (NOT연산)
<< (왼쪽 쉬프트연산)
>> (오른쪽 쉬프트연산)
이렇게 비트연산에는 6가지가 있습니다.
&(AND연산)
진리표
입력이 모두 1일때만 출력이 1이 됩니다.
입력1
입력2
출력
0
0
0
0
1
0
1
0
0
1
1
1
5~8번째줄은 실제로 &연산을해서 값을 출력해본것이고 10~15번째줄은 실제로 if문에 사용한 것입니다. a&b를하면 1이므로 True가 됩니다.
|(OR연산)
진리표
입력 한쪽이 1만되도 출력이 1이 됩니다.
입력1
입력2
출력
0
0
0
0
1
1
1
0
1
1
1
1
^(XOR연산)
진리표
입력1
입력2
출력
0
0
0
0
1
1
1
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번째비트가 됩니다.
ADLAR변수가 1이면 ADCL에있는 ADC1,ADC0이 2번째비트,1번째비트가 됩니다.
1 2 | unsigned int a=0; a = (ADCL>>6) | (ADCH<<2); | cs |
'프로그래밍 언어 > C언어' 카테고리의 다른 글
C언어 구조체 자료형의 크기(패딩비트) (0) | 2017.08.17 |
---|---|
C언어 구조체 사용하기. (0) | 2017.08.16 |
C언어 include 사용법 (0) | 2017.05.29 |
C언어 값을 절대값 취하기(stdlib.h , math.h) (0) | 2017.01.04 |
C언어 문자열을 처리하는 함수들(String.h) (0) | 2016.12.21 |