求助:用指定位运算符实现C语言的条件返回函数counter1To5
修正后的C语言实现
首先分析原代码的问题:当输入x≥5时,((x + ~4) >> 31)的结果是0(因为x+~4等价于x-5,x≥5时结果非负,右移31位后符号位为0,全0),此时0 & (x+1)返回0,但题目要求此时返回1,这是核心错误。
修正后的代码利用符号位掩码实现条件选择,符合运算符限制:
int counter1To5(int x) { int mask = (x + ~4) >> 31; return ((x + 1) & mask) | (1 & ~mask); }
逻辑解释
- 掩码构造:
x + ~4等价于x - 5(补码特性:~n = -n -1,所以x + ~4 = x + (-4 -1) = x -5)。将结果右移31位(针对32位有符号整数):- 若x < 5,
x-5为负数,右移31位后得到全1的二进制(即-1),此时mask = -1 - 若x ≥5,
x-5为非负数,右移31位后得到全0的二进制,此时mask = 0
- 若x < 5,
- 条件选择:
- 当x <5时,
(x+1) & mask保留x+1(因为-1与任何数按位与都等于原数),1 & ~mask为0(~mask是0),最终结果为x+1 - 当x ≥5时,
(x+1) & mask为0,1 & ~mask保留1(~mask是-1),最终结果为1
- 当x <5时,
验证示例
counter1To5(2):mask=(2-5)>>31=-1,(2+1)&-1=3,1&0=0,返回3|0=3,符合要求counter1To5(5):mask=(5-5)>>31=0,(5+1)&0=0,1&-1=1,返回0|1=1,符合要求counter1To5(4):返回5,符合1<=f(x)<=5的限制counter1To5(6):返回1,符合要求
运算符计数
总共使用的运算符次数:~(1)、+(2)、>>(1)、&(2)、~(1)、|(1),合计8次,远低于15次的限制。
内容的提问来源于stack exchange,提问作者jess
相关产品推荐
相关产品推荐

