【位运算-简单】面试题 16.07. 最大数值

【题目】
编写一个方法,找出两个数字a和b中最大的那一个。不得使用if-else或其他比较运算符。
【示例】
输入: a = 1, b = 2
输出: 2
【代码】
【Python】
在这里插入图片描述

class Solution:
    def maximum(self, a: int, b: int) -> int:
        return (a+b+abs(a-b))//2

【异常大法】
在这里插入图片描述

class Solution:
    def maximum(self, a: int, b: int) -> int:
        try:
            int(str(a - b)[0])
        except:
            return b
        return a

【最好的方法】
1.先看return语句,如果k=0,return值为a;如果k=1,return值为b;也就是说,如果a>b,我应该令k=0,否则令k=1.现在的问题是如何确定k的值呢?
2.然后看第一和第二行。需要先了解int类型的存储方式,这个网上搜得到。理解以后,继续看:因为a和b均为int,也就是在[-232,232-1]的区间内,可以确定a-b在(-233,233-1)的区间内。
2.1 如果a-b<0,那么a-b的左起33位必为1,因此233和a-b进行一个与操作得到233,记录在k中。k右移33位得到1.
2.2 否则,a-b>0,那么a-b的左起33位必为0。此时k的值为0.
将步骤2和步骤1联合起来看,得到答案。

class Solution:
    def maximum(self, a: int, b: int) -> int:
        k=(a-b)&(2**33)
        k=k>>33
        return k*b+a*(k^1)

【3】

class Solution:
    def maximum(self, a: int, b: int) -> int:        
        k=((a-b)>>32)&1
        return k*b+a*(k^1)

猜你喜欢

转载自blog.csdn.net/kz_java/article/details/115054665