当前位置:  开发笔记 > 编程语言 > 正文

如何在不使用任何比较运算符且不使用if,else等的情况下以编程方式返回两个整数的最大值?

如何解决《如何在不使用任何比较运算符且不使用if,else等的情况下以编程方式返回两个整数的最大值?》经验,为你挑选了4个好方法。

如何以编程方式返回的最大两个整数,而无需使用任何比较运营商和不使用if,else等等?



1> plinth..:

max://将MAX(a,b)放入a

a -= b;
a &= (~a) >> 31;
a += b;

和:

int a,b;

min://将MIN(a,b)放入

a -= b;
a &= a >> 31;
a += b;

从这里开始.



2> MSN..:

http://www.graphics.stanford.edu/~seander/bithacks.html#IntegerMinOrMax

r = x - ((x - y) & -(x < y)); // max(x, y)

你可以通过算术转换(x - y)来使符号位饱和,但这通常就足够了.或者你可以测试高位,总是很有趣.


好吧,要完全迂腐,你应该谈论分支,而不是比较运算符,因为分支更有可能导致性能问题.但无论如何,这就是为什么我在下面添加了额外的评论,因为x 没有比较运营商......?

3> Nicholas Fly..:

我想我已经明白了.

int data[2] = {a,b};
int c = a - b;
return data[(int)((c & 0x80000000) >> 31)];

这不行吗?基本上,你取两者的差异,然后根据符号位返回一个或另一个.(这就是处理器无论如何都要大于或小于的程度.)因此,如果符号位为0,则返回a,因为a大于或等于b.如果符号位为1,则返回b,因为从a中减去b导致结果变为负数,表明b大于a.只需确保您的整数是32位签名.



4> 小智..:

在数学世界中:

max(a+b) = ( (a+b) + |(a-b)| ) / 2
min(a-b) = ( (a+b) - |(a-b)| ) / 2

除了在数学上是正确的之外,它没有像移位操作那样对位大小进行假设。

|x| 代表x的绝对值。

评论:

没错,绝对值被遗忘了。这对所有a,b的正数或负数均有效

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有