임베디드

[비트연산] 특정 위치 비트 set / clear / 반전

히똔 2022. 4. 9. 15:53
728x90
반응형

비트연산은 임베디드 개발시 기본중에 기본 지식이다.
포트의 특정 핀에 전선으로 연결된 장치를 on/off 하기 위해서는 특정 위치 비트를 0>1 / 1>0 로 바꿀 수 있어야한다.

예를 들어, 모터가 MCU의 6번 핀에, 전등이 3번 핀에 연결되어 있을때, 각각의 장치가 따로 동작할 수 있어야한다.

임베디드 개발 시 특정 위치 비트에 대한 set/clear 방법을 알아야함.

포트에 0000 0100 값을 넣으면 전등이 켜질 것이고,
포트에 0010 0000 값을 넣으면 전등은 꺼지고 모터가 켜질 것이다.

장치 서로의 영향을 주지 않고 각각 따로 모터에 작동 시키기 위해선 비트연산을 활용해야한다.

 

비트 clear

특정 비트를 0으로 만드는 것

 

비트 set

특정 비트를 1로 만드는 것

 

특정 비트 set하기

a : 대상 비트, n : set하고 싶은 비트 위치일때 다음과 같이 표현할 수 있다.

a _nset = a | (1<<n);

다음 예시로 더 이해가 잘 갈 것이다.

unsigned char a = 0b11000001;

unsigned char a_1set = a | (1<<1); // 0b11000011 - 1번 set
unsigned char a_5set = a | (1<<5); // 0b11100001 - 5번 set
unsigned char a_13set = a | (7<<1); // 0b11001111 - 1~3번 set (7 == 0b111)

 

특정 비트 clear 하기

a : 대상 비트, n : clear하고 싶은 비트 위치

a_nclr = a & ~(1<<n);

예시

unsigned char a = 0b11001110;

unsigned char a2clr = a & ~(1<<2); // 0b1101010 - 2번 clr 
unsigned char a13clr = a & ~(7<<1); // 0b11000000 - 1~3번 clr

 

특정 비트 반전시키기

on일때 off로, off일때 on으로 바꾸고 싶을 때 비트 연산 XOR(^) 을 이용한다.

a : 대상 비트, n : 반전시키고 싶은 비트 위치

b_nxor = a ^ (1<<n);

예시

unsigned char a = 0b10011100;

unsigned char a2xor = a ^ (1<<2); // 0b10011000 2번 비트 반전
unsigned char a13xor = a ^ (7<<1); // 0b10010110 1~3번 비트 반전

 

비트 연산 연습하면 좋을 문제 - 정올) 3293 : 비트연산 1

http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=2583&sca=50 

 

JUNGOL

 

www.jungol.co.kr

 

728x90
반응형