我在处理遗留代码时遇到了以下 C 函数,我完全困惑,代码的组织方式。我可以看到该函数正在尝试在位流中的给定位置设置位,但我无法理解各个语句和表达式。有人可以解释为什么开发人员在这里和那里使用除以 8 (/8) 和模 8 (%8) 表达式。有没有一种简单的方法可以在 c 中读取这些类型的位操作函数?
static void setBits(U8 *input, U16 *bPos, U8 len, U8 val)
{
U16 pos;
if (bPos==0)
{
pos=0;
}
else
{
pos = *bPos;
*bPos += len;
}
input[pos/8] = (input[pos/8]&(0xFF-((0xFF>>(pos%8))&(0xFF<<(pos%8+len>=8?0:8-(pos+len)%8)))))
|((((0xFF>>(8-len)) & val)<<(8-len))>>(pos%8));
if ((pos/8 == (pos+len)/8)|(!((pos+len)%8)))
return;
input[(pos+len)/8] = (input[(pos+len)/8]
&(0xFF-(0xFF<<(8-(pos+len)%8))))
|((0xFF>>(8-len)) & val)<<(8-(pos+len)%8);
}