0

考虑以下整数:

uint32_t p = 0xdeadbeef;

我想得到:

  • 0..3 位,所以我做到了: p & ((1 << 4) - 1);结果很好。

但是,对于 4..7,我尝试的并没有按预期进行:

(p >> 16) & 0xFFFF0000

为什么它不提取我想要的位?我不是p向右移动 16 个位置然后取出 4 个位吗?

非常感谢您的解释,谢谢!

4

2 回答 2

1

不,您实际上是从 p 中删除位 0 到 15,因此它将保持 0xdead,然后您按位执行,因此这将产生 0。

如果要提取高 16 位,则首先必须进行 & 操作,然后再进行移位:

p = (p & 0xffff0000) >> 16;

要提取第 4 到 7 位,您需要执行以下操作:

p = p & 0xf0;

或者如果你想让它们向下移动

p = (p & 0xf0) >> 4;

顺便提一句。难道这意味着术语 nibble 4 到 7 而不是 bit 4..7?半字节是 4 位,由一个十六进制数字表示,这与您在代码中尝试的内容相关

于 2013-10-28T13:03:42.490 回答
1

如果你想从 4..7 获取位

(p>>4) & 0xf

如果你想从到获取N(N+4-1)

(p>>N) & 0xf

并且N应该 <32(如果您的系统是 32 位系统)。否则你会得到未定义的行为

于 2013-10-28T13:05:27.393 回答