程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

不用任何比较判断找出两个数中较大的数

发布于2020-02-24 22:15     阅读(750)     评论(0)     点赞(17)     收藏(5)


不用任何比较判断找出两个数中较大的数

位运算找出两整型较大值

【题目】
给定两个32位整数a和b,返回a和b中较大的。

【要求】
不用任何比较判断。


算法思路

判断转换位运算实现
sign获取符号位,flip翻转符号位
判断a-b的符号位
  符号位为0表示为正,符号位为1表示为负
  为正返回a,为负返回b
  因此same=flip(sign(a-b)) * a + sign(a-b) * b返回同号两者较大值

a-b结果可能溢出,添加条件判断——异号时符号位与被减数相同
dif=flip(sign(a)) * a + sign(a) * b返回异号两者较大值;

最终结论
通过a和b符号位是否相同(flag_dif=sign(a) ^ sign(b)),结合同号异号的情况。
flag_dif * dif + flip(flag_dif) * same返回最终两者较大值。

相应代码

# 翻转
# 注意不能使用~n,~0=-1,~1=-2,因为~是整个数按位取反
def flip(n):
    return n ^ 1

# 获取32位整型符号位,0为正数,1为负数
# (n & 0x80000000) >> 31亦可
def sign(n):
    return (n >> 31) & 1

# 判断a-b的符号
# a-b存在结果溢出问题,需添加条件判断——异号时符号位与被减数相同
def get_max(a, b):
    sub = a - b
    sign_sub = sign(sub)
    same = flip(sign_sub) * a + sign_sub * b  # 同号结果
    sign_a = sign(a)  # a的符号位,0为正,1为负
    sign_b = sign(b)
    flag_dif = sign_a ^ sign_b  # a,b是否异号,0表示False,1表示True
    dif = flip(sign_a) * a + sign_a * b  # 异号结果
    return flag_dif * dif + flip(flag_dif) * same

# 简单测试
if __name__ == '__main__':
    n = 10
    print(sign(n))  # 0
    n = -10
    print(sign(n))  # 1
    n = 100
    print(sign(n))  # 0
    n = -100
    print(sign(n))  # 1

    print(get_max(3, 4))  # 4
    print(get_max(4, 3))  # 4
    print(get_max(-3, 4))  # 4
    print(get_max(3, -4))  # 3
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

有任何疑问和建议,欢迎在评论区留言和指正!

感谢您所花费的时间与精力!

发布了76 篇原创文章 · 获赞 65 · 访问量 2万+


所属网站分类: 技术文章 > 博客

作者:yoyo

链接:https://www.pythonheidong.com/blog/article/232383/8bc329e4141c113e99b9/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

17 0
收藏该文
已收藏

评论内容:(最多支持255个字符)