如何用位运算实现:输入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
原理:
~x + 1是x的补码相反数(即-x)。x >> 31:32位有符号整数中,正数右移31位结果为0,负数右移31位结果为-1,0右移31位结果为0。(-x) >> 31:正数的相反数是负数,右移31位为-1;负数的相反数是正数,右移31位为0;0的相反数是0,右移31位为0。(x >> 31) | (-x >> 31):x=0时结果为0 | 0 = 0;x≠0时结果为0 | -1 = -1或-1 | 0 = -1。- 最后加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输出 |
|---|---|---|
| 0 | 1 | 1 |
| 1 | 1 | 1 |
| 2 | 2 | 2 |
| -1 | -1 | -1 |
内容的提问来源于stack exchange,提问作者user3600124
相关产品推荐
相关产品推荐

