如何无分支实现:输入为0返回全置位值,否则返回原输入的函数?
无分支实现方案
针对你给出的函数,这里提供几种无分支的实现方式,核心思路是通过位运算生成一个掩码,在输入为0时用全1掩码(即-1,对应0xffffffff)替换原输入,否则保留原输入:
方法一:逻辑非+取负+按位或(最简洁)
int f(int c) { return c | -( !c ); }
原理:
!c会将输入0转换为1,非0值转换为0;- 对
!c取负后,0对应的结果是-1(二进制全1,即0xffffffff),非0对应的结果是0; - 按位或操作:0和全1或得到全1,非0值和0或保持原值,完全匹配需求。
方法二:比较结果取负+按位或
int f(int c) { return c | -(c == 0); }
原理:
c == 0返回布尔值1(输入为0)或0(输入非0);- 取负后得到
-1或0,后续按位或逻辑和方法一一致。部分编译器会将c == 0优化为无分支的位测试指令,不会产生跳转。
方法三:乘法组合(可读性稍弱)
int f(int c) { return c * !!c + (-1) * !c; }
原理:
!!c将非0值转为1,0转为0,因此c * !!c在输入非0时等于c,输入为0时等于0;!c则相反,输入0时为1,非0时为0,因此(-1) * !c在输入0时等于-1,非0时等于0;- 两者相加即可得到目标结果。
这些实现均基于补码整数系统(当前绝大多数系统的标准),对32位、64位int均适用,且不会产生分支跳转。
内容的提问来源于stack exchange,提问作者user1002430
相关产品推荐
相关产品推荐

