블로그를 처음 개설하고, 프로그래밍 카테고리에 올린 것이..비트 연산이었는데,
요즘 회사일이 여유가 생긴 탓에, 임베디드 프로그래밍 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))
위에 처럼 한 비트 설정 한 비트 반전도 마찬가지다..