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

如何仅用指定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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 23:57:06