본문 바로가기

카테고리 없음

bit 연산

블로그를 처음 개설하고, 프로그래밍 카테고리에 올린 것이..비트 연산이었는데,
요즘 회사일이 여유가 생긴 탓에, 임베디드 프로그래밍 C코드 최적화란 책을 사서 읽어보고 있는데
거기에 비트 제어에 대해서 나와 있길래 다시 한 번 확실히 정리하고자 한다.

다 아는 내용이겠지만, 알면 유용한 것들이 많으니 한 번 살펴보자


1. 특정비트를 1로 설정 하려면 지정된 위치의 비트를 1과 |(OR)연산

ex)5번 비트를 1로 설정 (제일 왼쪽 비트가 0번이라고 하면..)
      01010101 (a)
OR  0010000
-----------------
      01110101


코드화 한다면 a|=0x00100000;  


그런데 0x00100000는 0x1을 5번 왼쪽 shift한값과 같으므로  0x1<<5와 같이 표현할수 있다

따라서 a|=0x1<<5;


한 번에 여러비트 설정도 가능하다.예를 들어 5,3,2번 비트를 1로 설정하려면
a|= (0x1<<5)+(0x1<<3)+(0x1<<2) 와 같이 표현 할 수 있다.
그런데 3번 2번 비트는 연속된 비트이기 때문에 0x3으로 묶어 줄수 있다.
a| =(0x1<<5) + (0x3<<2)


2. 특정비트를 0으로 클리어 하려면 지정된 위치의 비트를 1과& (AND)연산

ex)2번 비트를 0로 clear (제일 왼쪽 비트가 0번이라고 하면..)
       01010101 (a)
AND 11111011
-----------------
       01010001
특정 비트 클리어는 지정된 비트를 0과  &연산함으로 수행된다. 0을 원하는 위치까지 쉬프트하여 &연산하고 나머지 비트들은 1과 &연산을 취하여 원래 값 그대로 유지한다..
그런데 한 가지문제 0x0000도 0x0도 모두 0이기 때문에 0으로 자릿수 표현할 수 없다. 그래서 1을 원하는 위치로 shift하고 그 값에 대해 NOT연산을 해서 0으로 만든다.
a &=~(0x1<<2)


3. 특정비트 반전
반전시키고자 하는 비트는 1과 ^연산..^연산은 두 피연산자가 같으면 0, 다르면 1
1^1=0이고 0^1=1
ex) 5번 비트 반전
a^=0x1<<5


4. 특정 비트추출
ex)6,5,4번 비트

(a>>4) & 0x7

5. 비트검사
:특정 비트가 0인지 1인지 검사하는 방법
ex)5번째 비트가 0인지 1인지
a& (0x1<<5)


비트 연산을 편하게...정리 해보면 다음과 같다

한 비트 클리어 ex:5번 비트  a &= (0x1<<5)

연속된 비트 클리어 ex)5,4,3번 비트 a&~(0x7<<3)

떨어져있는 비트클리어 ex)5,3,2 a&= ~((0x1<<5)+0x3<<2))

위에 처럼 한 비트 설정 한 비트 반전도 마찬가지다..