임베디드 프로그래밍에서 bit연산자 활용법(시프트 연산자, OR연산자)
* 비트연산자란?
데이터를 bit단위로 처리하여 메모리 공간 사용을 효율적으로 사용할 수 있게 해주는 연산자로
하드웨어를 다루는 임베디드 시스템에서 유용하게 사용할 수 있다.
비트 연산자는 정수계통의 자료형인 char, int, long에만 사용할 수 있다.
연산자 |
설명 |
사용 예 |
결과 |
|
시프트(Shift) 연산자 |
||||
>> |
해당 비트만큼 우측으로 이동 |
0xFF >> 4; |
1111 1111 >> 4 → 0000 1111 : 0xF |
|
<< |
해당 비트만큼 좌측으로 이동 |
0x0F << 4; |
0000 1111 << 4 → 1111 0000 : 0xF0 |
|
비트 논리 연산자 |
||||
& |
bit단위로 AND 연산 |
0xA & 0x5; |
1010 & 0101 → 0000 |
|
| |
bit단위로 OR 연산 |
0xA | 0x5; |
1010 | 0101 → 1111 |
|
^ |
bit단위로 XOR 연산 |
0xA ^ 0x5; |
1010 ^ 0101 → 1111 |
|
보수 연산자 ( 1의 보수, NOT연산 ) |
||||
~ |
bit를 반전시킴 |
~0xBD; |
~1011 1101 → 0100 0010 |
다음 소스는 임베디드 프로그래밍에서 비트 연산자가 사용되는 예를 보여준다.
< lcd.h >
위 헤더파일에서는 각 핀을 시프트 연산과 define문을 이용하여 지정하는 것을 확인 할 수 있다.
11~13번 라인에서 LCD의 RS, RW, E 핀이 ARM보드의 24~26번에 연결되어 있으므로 1을 해당 핀의 위치만큼
좌측으로 시프트 연산을 해줘서 각 핀을 지정해준다.
14번 라인은 데이터 버스가 16~23번핀까지 연결되어 있으므로 0xFF를 16번 좌측으로 이동시켜준다.
< lcd.c >
위의 소스에서는 lcd.h에 define문으로 정의되어 있는 레지스터에(PIO_OER, PIO_PER)
비트 연산으로 한 번에 값을 채워넣는 것을 확인 할 수 있다.
ARM칩은 32bit로 설계되어 있으므로 레지스터에 bit연산을 이용하여 각 핀들의 정보를
집어 넣을 수 있다.
PIO_OER과 PIO_PER에 대입되는 값을 살펴보면,
LCD_RS : 0000 0001 0000 0000 0000 0000 0000 0000
LCD_RW : 0000 0010 0000 0000 0000 0000 0000 0000
LCD_EN : 0000 0100 0000 0000 0000 0000 0000 0000
LCD_BS : 0000 0000 1111 1111 0000 0000 0000 0000
위의 네 값을 OR연산하면
PIO_OER: 0000 0111 1111 1111 0000 0000 0000 0000
이라는 값이 최종적으로 대입되는 것을 확인 할 수 있다.