数学上查找最高值,而条件比较(Mathematically Find Max Value witho

2019-07-04 16:57发布

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

codymanix和月影是一个很大的帮助迄今。 我可以用公式,而是采用右移我由29因为与32位划分签订2 ^ 31解决我的问题=溢出到29.其中一期工程!

原型机于PHP

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

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

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

----------原来的问题-----------
我不认为这是我的应用程序的限制,很有可能,但我想这是值得一试的要求。

我会尽量让这个简单的。 我需要找到两个数字之间的最高值,而不能使用IF或任何条件语句。

为了找到的最高值,我只能执行以下功能

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

比方说,我有两个数字

A = 60;
B = 50;

现在,如果总是比乙这将是简单的找到最大值更大

MAX = (A - B) + B;
ex. 
10 = (60 - 50)
10 + 50 = 60 = MAX

问题是一个并不总是大于B.我不能跟我使用的脚本应用程序了执行ABS,MAX,MIN或条件检查。

是否有任何可能的方式使用上述动作限制找到非常接近最高值?

Answer 1:

查找最大2个变量:

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

其中>>是逐位右移(也称为SHR或ASR上的符号性depeding)。

而不是31个您使用的位数您的号码有减一。



Answer 2:

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

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

其中, |ab| 之间差的大小ab



Answer 3:

如果你不能信任你的环境下生成可用时适当网点操作,请参阅此页面了解如何进行。 注意,输入范围的限制; 使用较大的整数类型的操作,如果你不能保证你的投入将适合。



Answer 4:

解决方案,而条件句。 投射到UINT然后回到诠释让腹肌。

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); }


Answer 5:

仅使用逻辑运算,短路评价并假定向零取整的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不四舍五入的惯例。



Answer 6:

嗯。 我认为NOT,AND和OR是按位? 如果是这样,将是一个逐位表达式来解决这个问题。 需要注意的是A | 乙会给数> = 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)和(我的逻辑在这里)



Answer 7:

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;


Answer 8:

试试这个,(但要注意的溢出)(在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;        
    }


Answer 9:

你可以表达这种一系列算术和位操作,例如:

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;
}


Answer 10:

请看看这个程序..这可能是最好的答案,直到日期此页面上...

#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;
}


Answer 11:

//Assuming 32 bit integers 
int is_diff_positive(int num)
{
    ((num & 0x80000000) >> 31) ^ 1; // if diff positive ret 1 else 0
}
int sign(int x)
{
   return ((num & 0x80000000) >> 31);
}

int flip(int x)
{
   return x ^ 1;
}

int max(int a, int b)
{
  int diff = a - b;

  int is_pos_a = sign(a);
  int is_pos_b = sign(b);

  int is_diff_positive = diff_positive(diff);
  int is_diff_neg = flip(is_diff_positive);

  // diff (a - b) will overflow / underflow if signs are opposite
  // ex: a = INT_MAX , b = -3 then a - b => INT_MAX - (-3) => INT_MAX + 3
  int can_overflow = is_pos_a ^ is_pos_b;
  int cannot_overflow = flip(can_overflow);
  int res = (cannot_overflow * ( (a * is_diff_positive) + (b * 
            is_diff_negative)) + (can_overflow * ( (a * is_pos_a) + (b * 
            is_pos_b)));

  return res;

}


Answer 12:

这取决于你使用的语言,但三元运营商可能是有用的。

不过,如果你不能在你的“脚本程序”执行条件的检查,你可能没有三元运算符。



Answer 13:

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

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

(1)如果条件语句是允许你做max = a>b ? a : b max = a>b ? a : b

(2)的任何其他方法既可以使用定义的一组数字的或依靠隐式的条件的检查。

(2A) max = a-((ab)&((ab)>>31))这是整齐的,但它仅适用if你使用32位数字。 你可以展开它任意大量的N,但如果你试图找到MAX(N-1,N + 1)的方法将失败。 该算法适用于有限状态自动机,但不是图灵机。

(2b)的幅度|ab| 是一个条件|ab| = ab>0 ab : ba |ab| = ab>0 ab : ba

关于什么:

平方根也是条件。 每当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某种形式的。



Answer 14:

#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


文章来源: Mathematically Find Max Value without Conditional Comparison