数学上找到没有条件比较的最大值

Alm*_*ous 18 math conditional algebra max min

- - - - - 更新 - - - - - -

到目前为止,codymanix和moonshadow一直是一个很大的帮助.我能够使用方程解决我的问题,而不是使用右移我除以29.因为32位签名2 ^ 31 =溢出到29.哪个有效!

PHP中的原型

$r = $x - (($x - $y) & (($x - $y) / (29)));
Run Code Online (Sandbox Code Playgroud)

LEADS的实际代码(你只能做一个数学函数PER LINE !!! AHHHH !!!)

DERIVDE1 = IMAGE1 - IMAGE2;
DERIVED2 = DERIVED1 / 29;
DERIVED3 = DERIVED1 AND DERIVED2;
MAX = IMAGE1 - DERIVED3;
Run Code Online (Sandbox Code Playgroud)

----------原始问题-----------
我不认为这很可能与我的应用程序的限制有关,但我认为值得一试.

我会尽力做到这一点.我需要找到两个数字之间的最大值,而不能使用IF或任何条件语句.

为了找到MAX值,我只能执行以下功能

Divide, Multiply, Subtract, Add, NOT, AND ,OR
Run Code Online (Sandbox Code Playgroud)

假设我有两个数字

A = 60;
B = 50;
Run Code Online (Sandbox Code Playgroud)

现在,如果A总是大于B,那么找到最大值就很简单了

MAX = (A - B) + B;
ex. 
10 = (60 - 50)
10 + 50 = 60 = MAX
Run Code Online (Sandbox Code Playgroud)

问题是A并不总是大于B.我无法使用我正在使用的脚本应用程序执行ABS,MAX,MIN或条件检查.

有没有办法使用上面的限制操作来找到非常接近最大值的值?

cod*_*nix 25

找到最多2个变量:

max = a-((a-b)&((a-b)>>31))

其中>>是按位右移(也称为SHR或ASR,取决于符号).

而不是31你使用你的数字减去一的位数.

  • 如果xy也导致溢出或下溢,这不起作用. (4认同)

小智 23

我想如果我们设法找到两个数字之间的差异(只有幅度不符号),这个将是最简单的

max = ((a+b)+|a-b|)/2;
Run Code Online (Sandbox Code Playgroud)

哪个|a-b|a和之间的差异b.

  • 这个答案非常有帮助。它还引导我得出“min = ((a+b)-|ab|)/2”。非常感谢! (2认同)

moo*_*dow 6

如果您无法信任您的环境以在可用时生成相应的无分支操作,请参阅此页面以了解如何继续操作.注意输入范围的限制; 如果您无法保证输入适合,请使用较大的整数类型进行操作.


Lee*_*ere 5

没有条件的解决方案.转换为uint然后返回int以获得abs.

int abs (a) { return (int)((unsigned int)a); }
int max (a, b) { return (a + b + abs(a - b)) / 2; }

int max3 (a, b, c) { return (max(max(a,b),c); }
Run Code Online (Sandbox Code Playgroud)