首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >解释这段代码,它不使用if-else或任何其他比较运算符来查找两个整数的最大值?

解释这段代码,它不使用if-else或任何其他比较运算符来查找两个整数的最大值?
EN

Stack Overflow用户
提问于 2011-01-23 15:39:45
回答 14查看 78K关注 0票数 80

找到两个数字中的最大值。不应使用if-else或任何其他比较运算符。我在网上公告牌上发现了这个问题,所以我想我应该在StackOverflow上问一下

示例输入: 5,10输出: 10

我找到了这个解决方案,有人能帮我理解这几行代码吗

代码语言:javascript
运行
复制
int getMax(int a, int b) {  
    int c = a - b;  
    int k = (c >> 31) & 0x1;  
    int max = a - k * c;  
    return max;  
}
EN

回答 14

Stack Overflow用户

发布于 2011-01-23 15:41:48

开始吧:(a + b) / 2 + |a - b| / 2

票数 28
EN

Stack Overflow用户

发布于 2011-01-23 15:42:08

使用按位黑客

代码语言:javascript
运行
复制
r = x ^ ((x ^ y) & -(x < y)); // max(x, y)

如果您知道INT_MIN <= x - y <= INT_MAX,,那么您可以使用以下代码,因为(x - y)只需要计算一次,因此速度更快。

代码语言:javascript
运行
复制
r = x - ((x - y) & ((x - y) >> (sizeof(int) * CHAR_BIT - 1))); // max(x, y)

来源:Bit Twiddling Hacks by Sean Eron Anderson

票数 22
EN

Stack Overflow用户

发布于 2011-01-24 19:13:58

代码语言:javascript
运行
复制
(sqrt( a*a + b*b - 2*a*b ) + a + b) / 2

这是基于与mike.dld's solution相同的技术,但我在这里所做的事情并不那么“明显”。"abs“操作看起来像是在比较某些东西的符号,但我在这里利用的是sqrt()总是返回正平方根的事实,所以我将其平方(a-b),将其完整地写出来,然后再次平方根,添加a+b并除以2。

你会看到它总是有效的:例如,用户的例子10和5,你得到sqrt(100 + 25 - 100) =5,然后将10和5相加得到20,除以2得到10。

如果我们使用9和11作为我们的数字,我们将得到(sqrt(121 + 81 - 198) + 11 + 9)/2 = (sqrt(4) + 20) /2= 22/2 = 11

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4772780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档