发布于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
有任何疑问和建议,欢迎在评论区留言和指正!
感谢您所花费的时间与精力!
作者:yoyo
链接:https://www.pythonheidong.com/blog/article/232383/8bc329e4141c113e99b9/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!