필요한 C언어 문법?
비트 연산자
기본적인 문법
비트 연산자
MCU를 다루기 위해서는 레지스터 들을 다룰 필요가 있습니다.
레지스터들에 값을 넣고, 빼고 할 때 1bit를 얻고 넣어야합니다.
비트 연산자는 5개로
or 연산 |
and 연산 &
not 연산 ~
shift연산 >>, <<
이정도만 알고 있어도 코드 작성엔 문제가 없습니다.
OR 연산자
or 연산자는 |(\위)에 있으며 둘 중 하나의 값이 1이면 1, 둘 다 0이면 0을 출력하는 연산자입니다.
(수업 중에 배운 것과 동일)
1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0
만약 이진수인 1010과 0110을 or 연산한다면, 각 자리마다 or 연산하는 것과 동일합니다.
1010 | 0110 = 1110
1010 | 1000 = 1010
0000 | 1000 = 1000
1000 | 0001 = 1001
여기서 3번째 4번째 예시를 보면
왼쪽의 4자리 이진 숫자에서 각각 1자리(1bit)의 값을 1로 바꿀 수 있다는 것을 알 수 있습니다.
이를 통해 추후 우리는 어떤 레지스터의 1bit만 바꿀 수 있게 되었습니다.
어떤 레지스터 x가 있고 영 번째 자리만 1로 바꾸고 싶다면 다음과 같이 하면 됩니다.
x = x | 1
첫 번째 자리만 바꾸고 싶다면
x = x | 2(=이진수로 10)
마찬가지로 7번째 자리를 바꾸고 싶다면
x = x | 128(=이진수로 10000000)
간단하게는
x |= 128
1bit단위로 1로 바꾸고 싶을 때는 or 연산자를 사용한다.
AND 연산자
AND 연산자는 &로 둘 다 1이어야만 1을 출력합니다.
1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0
이진수 AND연산을 할 때도 마찬가지로 1bit씩 연산합니다.
1010 & 1101 = 1000
1000 & 0101 = 0000
AND연산자는 NOT연산자와 같이 사용합니다.
NOT 연산자
NOT 연산자는 ~로 0을 1로 1를 0으로 바꿔줍니다.
~1 = 0
~0 = 1
이진수 NOT 연산을 할 때도 마찬가지로 1bit씩 연산합니다.
~1010 = 0101
~0000 = 1111
~0001 = 1110
NOT 연산자와 AND 연산자
NOT 연산자와 AND연산자를 활용하면
1bit 단위로 0으로 만들 수 있습니다.
1111의 영 번째 비트를 0으로 바구고 싶을 경우
1111 & ~(0001)
= 1111 & 1110
= 1110
위와 같은 결과를 얻을 수 있습니다.
만약 레지스터 x의 첫 번째 자리를 0로 만들고 싶다면
x = x & ~(2) 을 하면 x의 첫 번째 비트를 0으로 바꿀 수 있습니다.
간단하게 적으면
x &= ~(2)라고 쓸 수도 있습니다.
shift 연산자
shift 연산자는 값을 왼쪽 또는 오른쪽으로 옮길 때 사용합니다.
왼쪽으로 이동은 <<
오른쪽은 >>라고 씁니다.
"왼쪽의 숫자를 왼쪽으로 오른쪽 숫자만큼 이동시켜라"가 왼쪽 이동 연산이고
"왼쪽의 숫자를 오른쪽으로 오른쪽 숫자만큼 이동시켜라"가 오른쪽 이동 연산입니다.
1이라는 숫자를 왼쪽으로 1칸 옮기면 10(=십진수 2)
2칸 옮기면 100(=십진수 4)
1이라는 숫자를 오른쪽으로 1칸 옮기면 0
2칸 옮기면 0입니다.
수식으로 표현하면
1 << 1 = 10(십진수 2) (1을 왼쪽으로 1만큼 이동)
1 << 2 = 100(십진수 4) (1을 왼쪽으로 2만큼 이동)
1 >> 1 = 0
1 >> 2 = 0
만약 이진수를 옮기는 상황이라면, 이 역시 1bit단위로 연산하면 됩니다.
1010 << 1 = 10100
11111 << 3 = 11111000
1010 >> 1 = 101
11111 >> 3 = 11
1 << 5 = 100000
1 << 2 = 100
위의 모든 연산자를 조합하면 다음과 같이 정리할 수 있습니다.
레지스터 x의 n번째 bit를 1로 만들고 싶을 때
x = x | (1 << n) 또는
x |= (1 << n)
레지스터 x의 n번째 bit를 0으로 만들고 싶을 때
x = x & ~(1 << n)
x &= ~(1 << n)
Q01. 레지스터 x의 5번째 비트를 1로 바꿔라
x = x | (1 << 5)
또는
x |= (1 << 5)
Q02. 레지스터 x의 3번째 비트를 0으로 바꿔라
x = x & ~(1 << 3)
또는
x &= ~(1 << 3)
Q03. 레지스터 y의 6, 1번째 비트를 1로 바꿔라
x |= (1 << 6)
x |= (1 << 1)
또는
x |= (1 << 6) & (1 << 1)
Q04. 레지스터 y의 2, 5번째 비트를 0으로 바꿔라
y &= ~(1 << 2) & ~(1 << 5)
또는
y &= ~(1 << 2)
y &= ~(1 << 5)
Q05. 레지스터 x의 2번째 비트를 1, 5번째 비트를 0으로 바꿔라
x |= (1 << 2)
x &= ~(1 << 5)
'atmega328(아두이노 미니 이용)' 카테고리의 다른 글
스터디 상생플러스 2 - 2 (Atmega328 I/O제어 이론) (0) | 2020.04.13 |
---|---|
스터디 상생플러스 2 - 1 (Atmega328 I/O 방향 설정 이론) (0) | 2020.04.13 |
스터디 상생 플러스 1 - 1 (MCU에 대한 지식 습득) (0) | 2020.04.09 |
avr 로터리 엔코더 사용하기 05 (6) | 2017.10.09 |
비트 연산자 테스트 04 (0) | 2017.08.12 |