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

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

解释此片段,该片段不使用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

这也是正确的最高



欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zaji/5600441.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存