2009-08-24 3 views
5

누구나 ANSI C에 적합한 비트 조작 라이브러리를 알고 있습니까?ANSI C 용 비트 조작 라이브러리

// I assume LSB has index of 0 
int a = 0x123; 
setBits(&a,2,5, 0xFF); 
printf("0x%x"); // should be 0x13F 

int a = 0x123; 
printf("0x%x",getBits(&a,2,5)); // should be 0x4 

char a[] = {0xCC, 0xBB}; 
char b[] = {0x11, 0x12}; 
copyBits(a,/*to=*/4,b,/*from=*/,4,/*lengthToCopy=*/8); 
// Now a == {0x1C, 0xB2} 

bitfile라는 유사한 라이브러리가있다처럼, 변수에 뭔가를 특정 비트를 설정하지만, 직접 메모리 조작을 지원하지 않는 것 Jovial처럼 나는 기본적으로 필요한 것은 는 능력이다. 파일 스트림에 비트를 공급하는 것만 지원합니다.

쓰기가 어렵지는 않지만 테스트 된 것이 있다면 - 나는 바퀴를 다시 만들지 않을 것입니다.

어쩌면이 라이브러리는 더 큰 라이브러리 (bzip2, gzip은 일반적인 용의자입니까?)의 일부로 존재합니까?

+2

http://stackoverflow.com/questions/47981/how-do-you-set-clear-and-toggle-a-single-bit-in-c 꼭 필요한 경우 기능을 정리하십시오. – dmckee

+0

@dmckee 여기에있는 답변에는'copyBits' 기능이 포함되어 있지 않습니다. 함수를 래핑하는 것은 일반적으로 말하는 "필수"는 아니지만 잘 구조화 된 코드의 필수 요소입니다. –

답변

7

저는 라이브러리에 대해 "너무 간단합니다"라고 생각합니다. 대부분의 함수는 단지 하나 또는 두 개의 문장 일 뿐이므로 전형적인 C 프로그래머가 용인하는 것보다 라이브러리 함수를 호출하는 오버 헤드가 조금 더 많아진다. :

즉, 항상 우수한 glib은 더 복잡한 비트 지향 함수 중 하나 인 g_bit_nth_lsf()g_bit_nth_msf()을 가지고 있습니다. 이들은 각각 최하위 또는 최상위 비트에서 검색하여 첫 번째 비트 세트의 색인을 찾는 데 사용됩니다.

+1

방금 ​​썼습니다. 15 줄의 까다로운 코드와 훨씬 많은 단위 테스트가 필요했습니다. 그 일을하는 데는 꽤 시간이 걸렸지 만, 간단한 라이브러리를 제공하지 않아서 어떤 이득도 얻지 못합니다. –

+2

정말요? 'stdbool.h'는 꽤 간단합니다. – endolith

3

다음과 같은 매크로 먼 길을 올 것이다 :

#define SETBITS(mem, bits)  (mem) |= (bits) 
#define CLEARBITS(mem, bits) (mem) &= ~(bits) 
#define BIN(b7,b6,b5,b4, b3,b2,b1,b0)      \ 
(unsigned char)(           \ 
    ((b7)<<7) + ((b6)<<6) + ((b5)<<5) + ((b4)<<4) +  \ 
    ((b3)<<3) + ((b2)<<2) + ((b1)<<1) + ((b0)<<0)   \ 
) 

는 그런 다음 페이지 하단의 "FXT"책 (링크에서 어쩌면

int a = 0x123; 
SETBITS(a, BIN(0,0,0,1, 1,1,1,0)); 
printf("0x%x", a); // should be 0x13F 
+3

절반의 솔루션. GETBIT 매크로도 필요합니다. 그리고 루프. 나는 며칠 안에 나의 것을 올릴 것이다. –