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

作业求助:仅用指定位运算实现32位有符号整数x<=y判断函数

解决32位有符号整数x<=y的受限操作符实现问题

嘿,我太懂这种被受限操作符编程题卡壳的感觉了——这类题就是要抛开常规的比较运算符,钻进二进制的细节里找解法!咱们一步步拆解思路,最终实现符合要求的函数:

核心思路

32位有符号整数的关键是最高位(第31位)的符号位:0表示正数/0,1表示负数。x <= y的情况可以分成两类,我们分别处理后合并结果:

  1. x和y符号不同:只要x是负数(符号位为1),就必然满足x <= y
  2. x和y符号相同:此时y - x不会产生溢出(同符号整数相减的结果范围不会超出32位有符号数的边界),只要y - x的符号位为0(即结果非负),就满足x <= y

具体实现(带注释)

int isLessOrEqual(int x, int y) {
    // 获取x和y的符号位:负数右移31位会得到全1(0xffffffff),正数/0得到全0
    int s_x = x >> 31;
    int s_y = y >> 31;
    
    // 判断x和y是否符号不同:异或后全1表示符号不同,全0表示相同
    int diff_sign = s_x ^ s_y;
    
    // 符号不同时的有效情况:x是负数(s_x全1),此时结果为全1,否则0
    int diff_case = diff_sign & s_x;
    
    // 符号相同时,计算y - x:利用补码规则,-x = ~x + 1,所以y - x = y + (~x + 1)
    int sub = y + (~x + 1);
    
    // 获取y-x的符号位:0表示非负(y>=x),全1表示负(y<x)
    int sub_sign = sub >> 31;
    
    // 符号相同时的有效情况:y-x非负(sub_sign取反为全1),且符号相同(diff_sign取反为全1)
    int same_case = (~diff_sign) & (~sub_sign);
    
    // 合并两种有效情况:只要有一种满足,结果为全1,否则0
    int total = diff_case | same_case;
    
    // 把全1/全0转换成1/0:两次逻辑非操作,全1变1,全0变0
    return !!total;
}

操作符次数统计

咱们数一下用到的操作符次数:>>(3次)、^(1次)、&(2次)、~(2次)、+(2次)、|(1次)、!(2次),总共13次,远低于24次的限制,完全符合要求。

关键溢出处理说明

为什么不能直接用(x - y) >> 31来判断?因为当x是最小的32位有符号整数(0x80000000),y是正数时,x - y会溢出,结果变成正数(符号位为0),这会导致错误判断。而我们的思路通过先判断符号是否不同,提前处理了这种溢出场景,保证结果正确。

测试用例验证

  • 正数比较:isLessOrEqual(5,10)返回1,isLessOrEqual(10,5)返回0
  • 正负比较:isLessOrEqual(-5,10)返回1,isLessOrEqual(10,-5)返回0
  • 边界值:isLessOrEqual(0x80000000, 0x7fffffff)返回1,isLessOrEqual(0x7fffffff, 0x80000000)返回0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:37:17