0

对不起,如果标题有点混乱,这里有一个完整的解释:

假设我有以下结构:

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 ...

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

4

1 回答 1

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

Wheren是您感兴趣的最右边位的位置,并且m是由与您要提取的字段宽度一样多的二进制 1 组成的掩码。

顺便说一句,请注意,就标准而言,您的原始方法表现出未定义的行为。

于 2013-10-21T11:18:53.267 回答