-4

レガシー コードの作業中に次の 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);
}
4

1 に答える 1