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