SMALL
1 2 3 4 5 6 7 8 | 01010101 01010101 OR 00100000 AND 11111011 ----------------------- ------------------------ 01110101 01010001 | cs |
1. 특정 비트 설정
1 | a |= 0x00100000; | cs |
0x0010_0000은 0x1(0x0000_0001)을 5번 왼쪽 시프트한 값과 같으므로 아래와 같이 표현 할 수 있다.
1 | a |= (0x1 <<5) + (0x1 <<3) + (0x1 <<2); | cs |
그런데 3,2번 비트는 연속된 비트이기 때문에 0x3으로도 묶어줄 수 있다.
1 | a |= (0x1 <<5) + (0x3 <<2); | cs |
2. 특정 비트 클리어
특정 비트 설정(SET)과 달리 클리어는 지정된 비트를 0과 &함으로써 수행한다. 특정비트를 1로 설정할 때와 마찬가지로 0을 원하는 위치까지 시프트하여 &연산하고, 나머지 비트들은 1과 & 연산을 취하여 원래의 값을 그대로 유지한다. 그런데 한 가지 문제가 있는데, 0x0000도 0x0도 모두 0이기 때문에 0으로 자릿수를 표현할 수 없다는 것. 그래서 1을 원하는 위치로 시프트하고 그 값에 대해 ~(NOT)연산을 해서 0으로 만든다.
1 2 3 | 0x1 << 5 // 0x0010_0000 ~(0x1 << 5) // 0x1101_1111 | cs |
2번비트를 0으로 클리어하려면 소스 데이터에 0x11111011를 & 연산 해야 하므로
1 | a &= ~(0x1 << 2); | cs |
SET과 같이 한번에 여러 비트 클리어도 가능하다. 5,3,2번 비트를 클리어 한다고 가정한다면
1 | a &= ~(0x1 <<5) + (0x3 << 2)); | cs |
와 같이 표현된다.
3. 특정 비트 반전.
반전시키고자 하는 비트는 1과 ^ 연산을 취한다. ^연산은 두 피 연산자가 같으면 0으로 다르면 1로 설정된다. 그래서 1^1 = 0, 0^1 = 1이 되므로 원래의 비트는 1과 ^ 연산함으로써 반전된다.
1 | a ^= 0x1 << 5; // 5번 비트 반전 | cs |
5번째 비트가 0이면 0을 출력, 1이면 1을 출력한다.
5. 비트 추출
특정 비트만 추출하는 방법. 예를 들어 [6:4] 비트만 추출하고 싶다면 다음과 같이 사용하면 된다.
1 | a & 0x7 | cs |
6. 비트 연산의 활용
비트 연산을 응용하면 복잡한 로직도 비교적 짧은 코드로 만들 수 있다. 예를 들어 값을 무조건 4의 배수로 만들어야 하는 경우가 있다고 가정하자. 시작 값이 100이라고 하면 1을 더해도 4의 배수인 104로 증가해야 한다. 즉 정수를 더한 결과가 4의 배수가 아니라면 그보다 큰 가장 가까운 4의 배수로 값을 늘려주는 것이다. 코드를 어떻게 짜겠는가? 혹시 이렇게 생각했는가?
1 2 3 4 5 6 7 8 9 | start = 100; scanf("%d", &x); start += x; if((start % 4) == 1) start += 3; else if((start % 4 ) == 2) start +=2; else if((start % 4 ) == 3) start += 1; | cs |
start에 입력받은 값을 더한 결과 값을 % 4로 계산한다. 이 결과 값이 1이면 3을, 2이면 2를, 3이면 1을 더해서 4의 배수로 만들어준다. 그럼 다음 코드는 어떠한가?
1 2 3 | start += x; start += 0x3; start &= ~(0x3); | cs |
비트 연산을 활용하여 7줄로 표현된 것을 3줄로 줄였다. x 값을 더해주고 무조건 3을 더해주고 마지막 2비트를 클리어한다. 그러면 마지막 2비트는 무조건 올림이 된다.
출처 : 임베디드 프로그래밍 C코드 최적화, 김유진 지음
LIST
'개인자료 > 프로그래밍' 카테고리의 다른 글
망고보드(M32) 시리얼 케이블 만들기_Serial to 3Pin (0) | 2015.06.02 |
---|---|
Embedded Reference (0) | 2015.06.02 |
ARM에 사용되는 Register (0) | 2015.06.01 |
임베디드 레시피 및 망고보드(Cortex M-3) 구입 (0) | 2015.05.29 |
[임베디드 C] 비트 연산 매크로 (0) | 2015.05.17 |
[C언어] 인사말 정렬 프로그램 (0) | 2015.05.16 |
[C언어] 프로필 교환 프로그램 (0) | 2015.05.16 |
[C언어] 방명록 프로그램 (0) | 2015.05.15 |
[C언어] 지점별 실적관리 프로그램 (0) | 2015.05.15 |
[C언어] 단어 추출 프로그램 (2) | 2015.05.15 |