关于提取十六进制数低10位与高12位操作的正确性疑问
位操作疑问解答:获取低10位与右移保留高位
先看你提供的代码片段:
int X = 0x1234ABCD; int Y = 0xcdba4321; // a) print the lower 10 bits of X in hex notation int output1 = X & 0xFF; printf("%X\n", output1); // b) print the upper 12 bits of Y in hex notation int output2 = Y >> 20; printf("%X\n", output2);
问题1:使用X & 0x2FF获取X的低10位是否正确?
完全正确。十六进制的0x2FF转成二进制是1011111111,刚好是低10位全为1、其余高位为0的掩码。和X做按位与操作后,会精准保留X的低10位,同时清零更高位,完美解决原代码中0xFF仅覆盖8位的问题。
问题2:对Y执行右移20位操作是否会丢弃末尾20位,仅保留高12位?
分两种情况:
- 如果是32位无符号int,右移20位确实会丢弃低20位,原高12位会移到结果的低12位,直接打印就能得到正确的高12位值。
- 如果是32位有符号int,这里要注意:Y的值
0xcdba4321最高位是1(属于负数),有符号数的右移是算术右移,会用符号位(1)填充高位,右移20位后得到的结果会是0xFFFFFFCD(而非预期的0xCD)。这种情况下,需要在右移后加掩码& 0xFFF,也就是(Y >> 20) & 0xFFF,才能清除符号扩展出来的高位,只保留原本的高12位。
内容的提问来源于stack exchange,提问作者Primary Fire
相关产品推荐
相关产品推荐

