본문 바로가기

스터디 상생 플러스 1 - 2 (필요한 C언어 문법)

반응형

필요한 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)

 

반응형