C语言位操作问题:如何实现OddBits函数(仅用|和<<)
问题分析与修正
错误点
- 未初始化局部变量x:代码中
int x;未赋值,局部变量默认是未初始化的垃圾值,运行时恰好为0,导致后续所有移位、或运算结果都是0,最终返回值与预期的0xaaaaaaaa不符。 - 构造目标值逻辑错误:原代码没有从正确的基础常量出发构建目标值,完全偏离了生成奇数位全1(对应
0xaaaaaaaa)的路径。
修正方案
目标值0xaaaaaaaa是32位中所有**奇数索引位(从0开始计数,第1、3、5...31位)**为1的结果,我们可以从合法小常量(0xaa,不超过0xFF)出发,通过移位和或运算逐步扩展到32位:
int OddBits(void) { int x = 0xaa; // 初始值:10101010,占低8位的奇数位 x |= x << 8; // 扩展到16位:0xaaaa x |= x << 16; // 扩展到32位:0xaaaaaaaa return x; }
合规性验证
- 常量
0xaa不超过0xFF,符合要求 - 仅使用了
|和<<操作,共4次操作,远低于最多6次的限制 - 无循环、条件语句,未转换为无符号类型
- 32位机器下返回正确的
0xaaaaaaaa(十进制值为-1431655766)
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

