/*
协议栈开发经常用到的按位重新编码
函数说明:从src_地址处,偏移src_ofs位开始,
连续拷贝bit_cnt_个比特,
到dest_地址的偏移dest_ofs位处。
下面是C语言参考实现
*/
void bitcpy(void *dest_, int dest_ofs, const void *src_, int src_ofs, int bit_cnt_)
{
static const char bit_mask[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
#define BIT_SET(p, i, b) ((b) ? ((*(p))|=(bit_mask[i])) : ((*(p))&=(~(bit_mask[i]))))
char *src = src_ + (src_ofs / 8);//src_ofs>>3
char *dst = dest_ + (dest_ofs / 8);//dest_ofs>>3
int s_i = src_ofs % 8;//src_ofs&(8-1)
int d_i = dest_ofs % 8;//dest_ofs&(8-1)
int bit_cnt = bit_cnt_;
while (bit_cnt--)
{
BIT_SET(dst, d_i, ((*src) & bit_mask[s_i]) ? 1 : 0 );
if(++s_i == 8){
src ++;
s_i = 0;
}
if(++d_i == 8){
dst ++;
d_i = 0;
}
}
位拷贝bitcopy
最新推荐文章于 2022-11-02 00:58:38 发布