C语言AND位掩码运算结果与预期不符问题咨询
位掩码运算结果不符问题解答
问题根因
- C语言中进行位运算时,两个操作数会先扩展为相同位宽,默认低位对齐,不足的位在高位补0。你使用的32位int运行环境中,你写的7位十六进制掩码
0xF0F0F0F会自动扩展为32位的0x0F0F0F0F,和你手动计算时采用的高位对齐、低位补0的逻辑完全不同。 - 你手动计算时错误对齐了两个数的最高位,导致每一位的对应关系全部错位,自然得到错误的预期结果。
真实运算逻辑
32位环境下实际的与运算过程如下:
被操作数0x01111111:0000 0001 0001 0001 0001 0001 0001 0001 实际掩码0x0F0F0F0F:0000 1111 0000 1111 0000 1111 0000 1111 与运算结果: 0000 0001 0000 0001 0000 0001 0000 0001
上述结果转十六进制就是0x01010101,和你程序的输出完全一致,不存在前导0被忽略的问题。
符合预期的修改方案
如果你要实现“保留每个字节高4位、关闭低4位”的效果,只需要把掩码补全为8位十六进制的0xF0F0F0F0即可,修改后代码如下:
#include <stdio.h> int main() { printf("%08x", 0x01111111 & 0xF0F0F0F0); return 0; }
此时输出结果为00101010,和你手动计算的预期结果一致。
内容的提问来源于stack exchange,提问作者CL40
相关产品推荐
相关产品推荐

