找到两个数字中的最大值。不应使用if-else或任何其他比较运算符。我在网上公告牌上发现了这个问题,所以我想我应该在StackOverflow上问一下
示例输入: 5,10输出: 10
我找到了这个解决方案,有人能帮我理解这几行代码吗
int getMax(int a, int b) {
int c = a - b;
int k = (c >> 31) & 0x1;
int max = a - k * c;
return max;
}发布于 2011-01-23 15:41:48
开始吧:(a + b) / 2 + |a - b| / 2
发布于 2011-01-23 15:42:08
使用按位黑客
r = x ^ ((x ^ y) & -(x < y)); // max(x, y)如果您知道INT_MIN <= x - y <= INT_MAX,,那么您可以使用以下代码,因为(x - y)只需要计算一次,因此速度更快。
r = x - ((x - y) & ((x - y) >> (sizeof(int) * CHAR_BIT - 1))); // max(x, y)来源:Bit Twiddling Hacks by Sean Eron Anderson
发布于 2011-01-24 19:13:58
(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
https://stackoverflow.com/questions/4772780
复制相似问题