You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于提取十六进制数低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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 02:26:20