在无符号长整数中从N到N + 4提取4位

时间:2013-10-28 12:57:24

标签: c bit-manipulation

考虑以下整数:

uint32_t p = 0xdeadbeef;

我想得到:

  • 0..3位所以我做了: p & ((1 << 4) - 1);这很好。
然而,对于4..7我尝试的并没有像预期的那样:

(p >> 16) & 0xFFFF0000

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

非常感谢答案的解释,谢谢!

2 个答案:

答案 0 :(得分:1)

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

如果要提取高16位,首先需要输入&amp;之后的操作和转移:

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

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

p = p & 0xf0;

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

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

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

答案 1 :(得分:1)

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

(p>>4) & 0xf

如果您想从N(N+4-1)

获取位
(p>>N) & 0xf

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