2009-08-24 15 views
5

के लिए बिट मैनिपुलेशन लाइब्रेरी क्या कोई एएनएसआई सी के लिए एक अच्छा बिट मैनिपुलेशन लाइब्रेरी जानता है? Jovial में तरह तरहएएनएसआई सी

// 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 कहा जाता है कुछ एक चर में विशिष्ट बिट्स सेट करने के लिए, है, लेकिन यह प्रत्यक्ष स्मृति में गड़बड़ी का समर्थन नहीं लगती क्या मैं मूल रूप से की जरूरत है,, की क्षमता है। यह केवल स्ट्रीम स्ट्रीम करने के लिए बिट्स को खिलाने का समर्थन करता है।

लिखना मुश्किल नहीं है, लेकिन अगर कुछ परीक्षण किया गया है - तो मैं पहिया को फिर से नहीं चलाऊंगा।

शायद यह पुस्तकालय बड़ी लाइब्रेरी (bzip2, gzip सामान्य संदिग्ध हैं) के हिस्से के रूप में मौजूद है?

+2

http://stackoverflow.com/questions/47981/how-do-you-set-clear-and-toggle-a-single-bit-in-c यदि आपको जरूरी है तो कार्यों में जवाब लपेटें। – dmckee

+0

@dmckee उत्तर में 'copyBits' funtion शामिल नहीं है। और कार्यों में चीजों को लपेटना आम तौर पर "जरूरी" नहीं है, लेकिन यह अच्छी तरह से संरचित कोड के लिए जरूरी है। –

उत्तर

2

यह समस्या मैं अपने प्रश्न में से निपटने था होना करने के लिए

Algorithm for copying N bits at arbitrary position from one int to another

कई अलग अलग प्रदान की विकल्प हैं लगता है सबसे तेजी से fnieto द्वारा विधानसभा समाधान होने के साथ।

7

मुझे लगता है कि पुस्तकालय के लिए "बहुत सरल" माना जाता है; अधिकांश फ़ंक्शंस केवल एक कथन या दो होंगे, जो लाइब्रेरी फ़ंक्शन को कॉल करने के ऊपरी हिस्से को सामान्य सी प्रोग्रामर सहन करने से थोड़ा अधिक कर देगा। :)

उस ने कहा, हमेशा उत्कृष्ट 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 मैक्रो भी चाहिए। और एक पाश। मैं कुछ दिनों में मेरा पोस्ट करूंगा। –

संबंधित मुद्दे