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

时间:2009-09-03 20:51:19

标签: math conditional max algebra min

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

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

PHP中的原型

$r = $x - (($x - $y) & (($x - $y) / (29)));

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

DERIVDE1 = IMAGE1 - IMAGE2;
DERIVED2 = DERIVED1 / 29;
DERIVED3 = DERIVED1 AND DERIVED2;
MAX = IMAGE1 - DERIVED3;

----------原始问题-----------
我认为这不太适用于我的应用程序的限制,但我认为值得一试。

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

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

Divide, Multiply, Subtract, Add, NOT, AND ,OR

假设我有两个数字

A = 60;
B = 50;

现在,如果A总是大于B,那么找到最大值

就很简单了
MAX = (A - B) + B;
ex. 
10 = (60 - 50)
10 + 50 = 60 = MAX

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

是否有可能使用上面的限制操作找到非常接近最大值的值?

17 个答案:

答案 0 :(得分:24)

finding the maximum of 2 variables:

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

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

而不是31你使用你的数字减去1的位数。

答案 1 :(得分:22)

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

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

其中|a-b|ab之间差异的大小。

答案 2 :(得分:6)

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

答案 3 :(得分: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); }

答案 4 :(得分:3)

仅使用逻辑运算,短路评估并假设C舍入为零,可以将其表示为:

int lt0(int x) {
    return x && (!!((x-1)/x));
}

int mymax(int a, int b) {
    return lt0(a-b)*b+lt0(b-a)*a;
}

基本思想是实现一个将返回0或1的比较运算符。如果你的脚本语言遵循像python那样向舍入值舍入的约定,那么可以做类似的技巧。

答案 5 :(得分:2)

嗯。我假设NOT,AND,OR是按位的?如果是这样,那么将会有一个按位表达来解决这个问题。注意A | B将给出一个数字> = A和> = B.也许有一种修剪方法可以选择具有最多比特的数字。

要扩展,我们需要以下内容来确定A(0)或B(1)是否更大。

真值表:

0|0 = 0  
0|1 = 1
1|0 = 0
1|1 = 0

!A and B
因此,将给出更高位的索引。因此,比较两个数字中的每个位,当它们不同时,使用上面的表达式(非A和B)来确定哪个数字更大。从最高位开始,然后继续向下两个字节。如果没有循环结构,请手动比较每个位。

实施“何时不同”:

(A!= B)AND(我的逻辑在这里)

答案 6 :(得分:1)

function Min(x,y:integer):integer;
  Var
   d:integer;
   abs:integer;
 begin
  d:=x-y;
  abs:=d*(1-2*((3*d) div (3*d+1)));
  Result:=(x+y-abs) div 2;
 end;

答案 7 :(得分:0)

试试这个,(但要注意溢出)  (C#中的代码)

    public static Int32 Maximum(params Int32[] values)
    {
        Int32 retVal = Int32.MinValue;
        foreach (Int32 i in values)
            retVal += (((i - retVal) >> 31) & (i - retVal));
        return retVal;        
    }

答案 8 :(得分:0)

您可以将其表示为一系列算术和按位运算,例如:

int myabs(const int& in) {
  const int tmp = in >> ((sizeof(int) * CHAR_BIT) - 1);
  return tmp - (in ^ tmp(;
}

int mymax(int a, int b) {
    return ((a+b) + myabs(b-a)) / 2;
}

答案 9 :(得分:0)

请看这个程序..这可能是本页面上的最佳答案......

#include <stdio.h>

int main()
{
    int a,b;
    a=3;
    b=5;
    printf("%d %d\n",a,b);
    b = (a+b)-(a=b); // this line is doing the reversal
    printf("%d %d\n",a,b);
    return 0;
}

答案 10 :(得分:0)

.js

答案 11 :(得分:0)

这是我仅使用 +, -, *, %, / 运算符的实现

using static System.Console;

int Max(int a, int b) => (a + b + Abs(a - b)) / 2;
int Abs(int x) => x * ((2 * x + 1) % 2);

WriteLine(Max(-100, -2) == -2); // true
WriteLine(Max(2, -100) == 2);   // true

答案 12 :(得分:0)

using System;
namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            float a = 101, b = 15;
            float max = (a + b) / 2 + ((a > b) ? a - b : b - a) / 2;            
        }
    }
}

答案 13 :(得分:0)

我只是想出了一个表达: (( (a-b)-|a-b| ) / (2(a-b)) )*b + (( (b-a)-|b-a| )/(2(b-a)) )*a 如果 a>b 则等于 a,如果 b>a

则等于 b

当 a>b 时: a-b>0, a-b = |a-b|, (a-b)-|a-b| = 0 所以 b 的系数为 0

b-a<0, b-a = -|b-a|, (b-a)-|b-a| = 2(b-a) 所以 a 的系数是 2(b-a)/2(b-a),即 1 所以如果 a 更大,它最终会返回 0*b+1*a,反之亦然

答案 14 :(得分:-1)

这取决于您使用的语言,但Ternary Operator可能有用。

但是,如果您不能在“脚本应用程序”中执行条件检查,则可能没有三元运算符。

答案 15 :(得分:-1)

  

如果A总是大于B .. [我们可以使用] .. MAX = (A - B) + B;

没有必要。只需使用:int maxA(int A, int B){ return A;}

(1)如果允许条件限制,则执行max = a>b ? a : b

(2)任何其他方法使用一组已定义的数字或依赖于隐式条件检查。

(2a)max = a-((a-b)&((a-b)>>31))这很简洁,但只有if才能使用32位数字。您可以将它扩展为任意大数N,但如果您尝试查找max(N-1,N + 1),则该方法将失败。该算法适用于有限状态自动机,但不适用于图灵机。

(2b)幅度|a-b|是条件|a-b| = a-b>0 a-b : b-a

怎么样:
enter image description here

平方根也是一个条件。每当c>0c^2 = d我们有第二个解决方案-c,因为(-c)^2 = (-1)^2*c^2 = 1*c^2 = d。平方根在该对中返回最大值。我带来了int max(int c1, int c2){return max(c1, c2);}

的内置版本

如果没有比较运算符,数学运算非常对称且功率有限。如果没有某种if,则无法区分正数和负数。

答案 16 :(得分:-2)

#region GetMaximumNumber
/// <summary>
/// Provides method to get maximum values.
/// </summary>
/// <param name="values">Integer array for getting maximum values.</param>
/// <returns>Maximum number from an array.</returns>
private int GetMaximumNumber(params int[] values)
{
  // Declare to store the maximum number.
  int maximumNumber = 0;
  try
  {
    // Check that array is not null and array has an elements.
    if (values != null &&
        values.Length > 0)
    {
      // Sort the array in ascending order for getting maximum value.
      Array.Sort(values);

      // Get the last value from an array which is always maximum.
      maximumNumber = values[values.Length - 1];
    }
  }
  catch (Exception ex)
  {
    throw ex;
  }
  return maximumNumber;
}
#endregion