gpt4 book ai didi

c - 读取位宽数据的等效方法

转载 作者:太空宇宙 更新时间:2023-11-04 06:32:05 25 4
gpt4 key购买 nike

抱歉,如果标题有点困惑,这里有一个完整的解释:

假设我有以下结构:

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

将不胜感激带有解释和/或引用阅读的答案。

最佳答案

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 组成的掩码.

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

关于c - 读取位宽数据的等效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19492953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com