假设通过数组in来表示一个很大的数(in[0]表示最低bit),提取该数的第start位到第end位(计数起始位为0):
1 #define MAX_BYTE_LEN ( 48 ) 2 int getDataFromBitStartToEnd(unsigned char *in, unsigned char *out, int start, int end) 3 { 4 int i, cnt; 5 unsigned char mask[MAX_BYTE_LEN]; 6 // 清除第n位之前的位 7 unsigned char xx[8] = {0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe}; 8 // 清除第n位后面的位 9 unsigned char yy[8] = {0x7f, 0x3f, 0x1f, 0x0f, 0x07, 0x03, 0x01, 0x00}; 10 int byte_start, byte_end; 11 12 memset(mask, 0x00, sizeof(mask)); 13 14 #if 0 // 这种计算方法在两字节(如:bit15~bit16)的边界就会出现错误 15 cnt = end - start + 1; // 位总数 16 cnt = (cnt + 7) / 8; // 字节总数 17 for(i = 0; i < cnt; i++) 18 { 19 mask[start/8+i] = 0xff; 20 } 21 #endif 22 23 byte_start = start / 8; 24 byte_end = end / 8; 25 for(i = byte_start; i <= byte_end; i++) 26 { 27 mask[i] = 0xff; 28 } 29 30 31 // 前面mask的位可能会把"start之前"/"end之后"的一些位也mask上了 32 mask[start/8] &= ~xx[start%8]; // 清除起始之前多余的bit 33 mask[ end/8] &= ~yy[ end%8]; // 清除结束之后多余的bit 34 35 for(i = 0; i < MAX_BYTE_LEN; i++) 36 { 37 out[i] = in[i] & mask[i]; 38 } 39 40 return 0; 41 }