본문 바로가기
프로그래밍/C++

비트연산 정리

by 호군 2011. 11. 21.
반응형
메모리가 부족한 환경이나, 좀 더 나은 속도, 짧은 코딩을 하기 위해서 비트연산자를 사용하게 됩니다.
하지만 그와 반대로 대부분 코드를 이해하기가 더 힘들어지게 됩니다.
그러나 네이밍을 잘 한다면, 좀 더 보기가 나을 것 입니다.

비트연산자
&   :   AND
|   :   OR
^   :   XOR
~  :   NOT

아래 방법의 하나의 방법일 뿐 입니다.
참고는 하셔도 되지만, 성능이 정확도는 장담하지 않습니다.
좀 더 나은 방법들을 알고 계신분들은 댓글로 부탁드립니다.

※ 참고사항
LED 레지스터는 1byte이고, 각 비트가 하나의 LED로 가정합니다.
그러므로 LED 개수는 8개 미만 입니다. 의미를 두기 위해 unsigned char로 선언하였습니다.
마이크로프로그래밍에서는 P[Num]과 동일하다고 생각하시면 됩니다.

매개변수로 넘겨주는 값은 여러개의 LED를 제어 할 수 있습니다.
예를 들어 0b01001101 이라는 값을 넘겨주면 0, 2, 3, 6번째 비트를 제어 하겠다는 의미입니다.



특정 비트 '0'으로 설정하기
unsigned char LED = 0b001101010;

void setBitClear(unsigned char ucLeds) {
    unsigned char ucResult = LED & (~ucLeds);

    LED = ucResult;
}


특정 비트 '1'로 설정하기
unsigned char LED = 0b001101010;

void setBitSet(unsigned char ucLeds) {
    unsigned char ucResult = LED | ucLeds;

    LED = ucResult;
}


특정 비트 Blink 설정하기 ('0' --> '1'   ,   '1' --> '0')
unsigned char LED = 0b001101010;

void setBitBlink(unsigned char ucLeds) {
    usigned char ucResult, ucOffLeds, ucOnLeds;
   
    ucOnLeds = LED & ucLeds;
    ucOffLeds = ucLeds ^ ucOnLeds;
   
    ucResult = LED & ~ucOnLeds;
    ucResult = result | ucOffLeds;

    LED = ucResult;
}

만약 위의 Blink 코드가 길다고 생각하면 그냥 하나의 줄로 묶어버려도 됩니다.
좀 더 이해하기 쉽게 하기 위해서 풀어서 썼습니다.
한줄로 쓴다면 아래와 같이 되겠죠. 그냥 치환하시면 됩니다.
unsigned char ucResult = LED & (~(LED & ucLeds)) | (ucLeds ^ (LED & ucLeds));








반응형