2009-08-24 38 views
5

Có ai biết thư viện thao tác bit tốt cho ANSI C không? Những gì tôi về cơ bản cần, là khả năng, giống như trong Jovial để thiết lập bit cụ thể trong một biến, một cái gì đó giống nhưThư viện thao tác bit cho 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} 

Có một thư viện tương tự gọi là bitfile, nhưng nó dường như không hỗ trợ thao tác bộ nhớ trực tiếp. Nó chỉ hỗ trợ cho ăn bit để tập tin suối.

Không khó để viết, nhưng nếu có điều gì đó được kiểm tra - tôi sẽ không phát minh lại bánh xe.

Có thể thư viện này tồn tại như một phần của thư viện lớn hơn (bzip2, gzip là các nghi phạm thông thường)?

+2

http://stackoverflow.com/questions/47981/how-do-you-set-clear-and-toggle-a-single-bit-in-c Bao gồm các câu trả lời trong các hàm nếu bạn phải. – dmckee

+0

@dmckee câu trả lời không bao gồm chức năng 'copyBits'. Và gói những thứ trong các chức năng không phải là một "phải" nói chung, nhưng nó là phải cho mã có cấu trúc tốt. –

Trả lời

7

Tôi nghĩ rằng được coi là "quá đơn giản" đối với thư viện; hầu hết các chức năng sẽ chỉ là một tuyên bố hoặc hai, mà sẽ làm cho chi phí của việc gọi một chức năng thư viện nhiều hơn một chút so với các lập trình viên điển hình C chịu đựng. :)

Điều đó nói rằng, luôn tuyệt vời glib có hai trong số các chức năng định hướng bit phức tạp hơn: g_bit_nth_lsf()g_bit_nth_msf(). Chúng được sử dụng để tìm chỉ mục của tập bit đầu tiên, tìm kiếm từ bit thấp nhất hoặc bit cao nhất tương ứng.

+1

Tôi vừa viết nó và mất 15 dòng mã phức tạp và nhiều bài kiểm tra đơn vị hơn. Tôi mất một vài giờ để làm điều đó, và tôi không thấy có được lợi ích nào khi không cung cấp một thư viện đơn giản cho điều đó. –

+2

Thật sao? 'stdbool.h' khá đơn giản. – endolith

3

Bạn sẽ đi một chặng đường dài với các macro sau:

#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)   \ 
) 

Sau đó, bạn có thể viết

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

Nửa giải pháp. Bạn cũng cần một macro GETBIT. Và một vòng lặp. Tôi sẽ đăng bài của tôi trong một vài ngày. –

2

Có lẽ algorithms từ "fxt" cuốn sách (liên kết ở cuối trang) sẽ hữu ích.

Các vấn đề liên quan