栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

解释此片段,该片段不使用if-else或任何其他比较运算符就可以找到两个整数的最大值?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

解释此片段,该片段不使用if-else或任何其他比较运算符就可以找到两个整数的最大值?

int getMax(int a, int b) {    int c = a - b;    int k = (c >> 31) & 0x1;    int max = a - k * c;    return max;}

让我们对此进行剖析。第一行看起来很简单-它存储了

a
和的差
b
。如果为负,则该值为
a < b
负;否则为非负。其实这里有一个错误-
如果数字的差异
a
,并
b
是如此之大,它不适合到一个整数,这将导致不确定的行为-哎呀!因此,我们假设这里不会发生这种情况。

在下一行中

int k = (c >> 31) & 0x1;

想法是检查的值是否

c
为负。在几乎所有现代计算机中,数字都是以 二进制补码
的格式存储的,如果数字为正,则数字的最高位为0,如果数字为负,则数字的最高位为1。此外,大多数整数都是32位。
(c >>31)
将数字向下移动31位,将数字的最高位保留在最低位。取该数字并将其与1(其二进制表示除最后一位以外的所有地方均为0)进行下一步的操作将擦除所有较高位,并为您提供最低位。由于的最低位`c

31

是的最高位
c
,因此读取的最高位
c
为0或1。由于最高位是1,当iff
c
为1时,这是一种检查是否为
c
是负数(1)还是正数(0)。将此推理与上述内容结合使用,
k
如果为1 ,则为1
a < b`,否则为0。

最后一步是这样做:

int max = a - k * c;

如果

a < b
,则
k == 1
k * c = c = a - b
,依此类推

a - k * c = a - (a - b) = a - a + b = b

自以来,这是正确的最大值

a < b
。否则,如果
a >= b
,则
k == 0

a - k * c = a - 0 = a

这也是正确的最高



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/595143.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号