对不起,如果标题有点令人困惑,这里有一个完整的解释:
假设我有以下结构:
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 ...
非常感谢有解释和/或参考阅读的答案。
答案 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的掩码。
顺便提一下,请注意,就标准而言,您的原始方法会显示未定义的行为。