4.2 位域值提取


位域定义

C语言中的位域定义:

struct Bits{
    uint32_t b2:2;
    uint32_t b4:4;
};

提取位域定义的值算法如下:

符号定义:

  • w :定义的位宽,如 b2 的位宽为 2 bit;
  • p :位域字段的位偏移,如 b2 的位偏移为 0,b4 的位偏移为 2;
  • v :位域字段所在的整体数据值,如 b2 就在 uint32_t 的数据上;
  • r :计算的结果;

第1步:计算位域掩码

mask = (1 << w) - 1

第2步:逻辑右移

tv = v >> p

第3步:截取域至

v = tv & mask

总结

r = (v >> p) & ( (1 << w) - 1)

如果v是有符号数,就需要进行符号扩展。

符号扩展

第1步:计算符号掩码

smask = 1 << (w-1)

第2步:计算符号位值

signed = r & smask

第3步:符号扩展

signed != 0 ? ( r = r | (-1 « w) ) : r

总结

( (1 « (w-1)) & r) != 0 ? ( r = r | (-1 « w) ) : r