作业求助:仅用指定位运算实现32位有符号整数x<=y判断函数
解决32位有符号整数x<=y的受限操作符实现问题
嘿,我太懂这种被受限操作符编程题卡壳的感觉了——这类题就是要抛开常规的比较运算符,钻进二进制的细节里找解法!咱们一步步拆解思路,最终实现符合要求的函数:
核心思路
32位有符号整数的关键是最高位(第31位)的符号位:0表示正数/0,1表示负数。x <= y的情况可以分成两类,我们分别处理后合并结果:
- x和y符号不同:只要x是负数(符号位为1),就必然满足
x <= y - 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
相关产品推荐
相关产品推荐

