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

如何无分支实现:输入为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 23:15:44