考虑以下整数:
uint32_t p = 0xdeadbeef;
我想得到:
p & ((1 << 4) - 1);
这很好。 (p >> 16) & 0xFFFF0000
为什么不提取我想要的位?我是不是将p
16个位置向右移动然后取出4位?
非常感谢答案的解释,谢谢!
答案 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位系统)。否则你会得到未定义的行为