读取位宽数据的等效方法

时间:2013-10-21 11:11:22

标签: c bit-manipulation

对不起,如果标题有点令人困惑,这里有一个完整的解释:

假设我有以下结构:

union data {
    struct{
        uint32_t h : 16;
        uint32_t p : 16;
    };
    uint32_t f;
};

和以下代码:

struct data d;
d.f = 0xbaadf00d;
printf("%d %d\n", d.h, d.p);

我的问题如下,是否有使用按位运算的相同方法?类似的东西:

uint32_t u32 = 0xbaadf00d;
uint32_t h = u32 ... some hacks ...
uint32_t p = u32 ... some more hacks ...

非常感谢有解释和/或参考阅读的答案。

1 个答案:

答案 0 :(得分:4)

uint32_t d=0xbaadf00d;
printf("%d %d\n", d>>16, d&0xffff);

d>>16执行右移,右移高位16位(在高位置插入零),提取高16位(注意d是否为更宽的类型,你还必须应用一个掩码来杀死不需要的高位。

d&0xffff应用一个掩码,只允许最低16位通过。这是因为0xffff是一个整数,所有低16位都设置了,AND操作只保留掩码中对应于1的位。

一般来说,模式是这样的:

(d>>n) & m

n是您感兴趣的最右边位置的位置,而m是由您要提取的字段所构成的二进制1的掩码。

顺便提一下,请注意,就标准而言,您的原始方法会显示未定义的行为。