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

如何用位运算实现:输入0返回1,输入非0保持原值?

用位运算实现输入0返回1、非0返回原值的方案

要实现这个需求,核心是区分输入为0和非0的情况:当输入为0时返回1,非0时保持输入不变。以下是两种可行的实现方式:

方案1:结合逻辑非与加法(简洁易读)

表达式:x + (!x)

原理:

  • 当x = 0时,逻辑非!x的结果为1(多数编程语言中,逻辑非对0返回真,转整数为1),因此0 + 1 = 1,符合要求。
  • 当x ≠ 0时,!x的结果为0,因此x + 0 = x,保持原值不变。

代码示例(C语言):

int transform(int x) {
    return x + (!x);
}

方案2:纯位运算(不依赖逻辑运算)

如果要求完全使用位运算(不借助逻辑非),可使用以下表达式(以32位有符号整数为例):
x + ((x >> 31) | ((~x + 1) >> 31)) + 1

原理:

  1. ~x + 1是x的补码相反数(即-x)。
  2. x >> 31:32位有符号整数中,正数右移31位结果为0,负数右移31位结果为-1,0右移31位结果为0。
  3. (-x) >> 31:正数的相反数是负数,右移31位为-1;负数的相反数是正数,右移31位为0;0的相反数是0,右移31位为0。
  4. (x >> 31) | (-x >> 31):x=0时结果为0 | 0 = 0;x≠0时结果为0 | -1 = -1或-1 | 0 = -1。
  5. 最后加1:0 + 1 = 1(x=0时),-1 + 1 = 0(x≠0时),与x相加得到目标结果。

代码示例(C语言):

int transform(int x) {
    return x + ((x >> 31) | ((~x + 1) >> 31)) + 1;
}

验证用例:

输入值(十进制)方案1输出方案2输出
011
111
222
-1-1-1

内容的提问来源于stack exchange,提问作者user3600124

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 00:11:01