考虑以下整数:
uint32_t p = 0xdeadbeef;
我想得到:
- 0..3 位,所以我做到了:
p & ((1 << 4) - 1);
结果很好。
但是,对于 4..7,我尝试的并没有按预期进行:
(p >> 16) & 0xFFFF0000
为什么它不提取我想要的位?我不是p
向右移动 16 个位置然后取出 4 个位吗?
非常感谢您的解释,谢谢!
考虑以下整数:
uint32_t p = 0xdeadbeef;
我想得到:
p & ((1 << 4) - 1);
结果很好。但是,对于 4..7,我尝试的并没有按预期进行:
(p >> 16) & 0xFFFF0000
为什么它不提取我想要的位?我不是p
向右移动 16 个位置然后取出 4 个位吗?
非常感谢您的解释,谢谢!
不,您实际上是从 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 位,由一个十六进制数字表示,这与您在代码中尝试的内容相关
如果你想从 4..7 获取位
(p>>4) & 0xf
如果你想从到获取N
位(N+4-1)
(p>>N) & 0xf
并且N
应该 <32(如果您的系统是 32 位系统)。否则你会得到未定义的行为