从一个数组中提取出第start位到第end位

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

 

转载于:https://www.cnblogs.com/utank/p/5570620.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值