uTank-木头
每一个你不满意的现在,都有一个你没有努力的曾经。

假设通过数组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 }

 

posted on 2016-06-08 16:52  uTank  阅读(876)  评论(0编辑  收藏  举报