如何仅用指定C语言位运算实现sign函数,对应正负零返回1/0/-1
C语言sign函数实现问题排查与修正
现有代码的问题
你当前的实现核心问题在于所有运算的结果只能是0或1,无法输出要求的-1,且三个输入场景的返回值全部不符合预期:
(x >> 31) & 1仅能得到0(非负数)或1(负数)两个结果!x仅能得到0(非零)或1(零)两个结果- 两者异或的输出范围只有0和1,完全无法产生-1的返回值
逐场景验证现有代码输出:
- 输入负数:
(x >> 31) & 1 = 1,!x = 0,异或结果为1 → 预期返回-1,错误 - 输入0:
(x >> 31) & 1 = 0,!x = 1,异或结果为1 → 预期返回0,错误 - 输入正数:
(x >> 31) & 1 = 0,!x = 0,异或结果为0 → 预期返回1,错误
修正方案
利用32位有符号int的算术右移特性:有符号数右移31位时,负数会得到二进制全1(对应十进制-1),非负数会得到二进制全0(对应十进制0)。再配合!!x区分零和非零:!!x在x非零时返回1,x为零时返回0。
最终实现代码如下:
int sign(int x) { return (x >> 31) | (!!x); }
正确性验证
- 输入正数:
x >> 31 = 0,!!x = 1,按位或结果为1 → 符合要求 - 输入零:
x >> 31 = 0,!!x = 0,按位或结果为0 → 符合要求 - 输入负数:
x >> 31 = -1(二进制全1),!!x = 1,按位或后仍为全1即-1 → 符合要求
所有使用的运算符>>、|、!均在允许范围内,未使用减号运算符,满足题目限制条件。
内容的提问来源于stack exchange,提问作者CalebDunham
相关产品推荐
相关产品推荐

