不使用比较判断来比较两个数的大小
题目描述
请编写一个方法,找出两个数字中最大的那个。要求: 不得使用if-else等比较和判断运算符
给定两个int a和b,请返回较大的一个数。若两数相同则返回任意一个。
测试样例:
1,2
返回:2
方法一
常规思路: 使用Python的内置的max方法: max(a,b)
方法二
数学思路,a和b的差的绝对值是abs(a-b),将a与b的和加上差的绝对值是最大值的两倍,即:a + b + abs(a - b) = 2 * max(a,b)
;而a与b的和减去差的绝对值是最小值的两倍,即:a + b - abs(a - b) = 2 * min(a,b)
1 | class Max: |
方法三
很奇葩的思路。。。
令 c = (a-b) >> 31
- 当
a >= b
时,(a-b)是正数或零,(a-b)的二进制的符号位为0,将(a-b)右移31位,高位补0,右移后结果为0。 - 当
a < b
时,(a-b)是负数,(a-b)的二进制的符号位是1,将(a-b)右移31位,高位补1,右移后结果为-1。
可以在终端中试验一下:
1 | >> a,b = 1,2 |
然后: a + c * (a - b)
- 当 a >= b时,c = 0,则a + c * (a - b) = a,返回的是较大值a
- 当 a < b时,c = -1,则a + c * (a - b) = b,返回的是较大值b
代码实现:
1 | class Max: |