21

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

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

PHP 中的原型

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

LEADS 的实际代码(每行只能执行一个数学函数!!!啊啊啊啊!!!)

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 或条件检查。

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

4

18 回答 18

29

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

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

其中是和|a-b|之间的差异幅度。ab

于 2010-02-28T05:46:53.317 回答
28

找到2个变量的最大值:

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

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

您使用数字减一的位数而不是 31。

于 2009-09-03T21:01:35.360 回答
6

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

于 2009-09-03T20:59:27.767 回答
4

没有条件的解决方案。转换为 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); }
于 2011-11-11T20:24:35.580 回答
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 那样遵循向底值舍入的约定,则可以执行类似的技巧。

于 2009-09-04T04:00:26.693 回答
3
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;
于 2010-04-25T06:57:49.440 回答
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(我的逻辑在这里)

于 2009-09-03T20:57:22.657 回答
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;
}
于 2011-11-11T23:23:04.783 回答
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;        
    }
于 2009-09-03T21:05:49.077 回答
0

在 n 和 m 之间找到 MAX

MAX = ( (n/2) + (m/2) + ( ((n/2) - (m/2)) * ( (2*((n/2) - (m/2)) + 1) % 2) ) )
在c中使用#define:
#define MAX(n, m) ( (n/2) + (m/2) + ( ((n/2) - (m/2)) * ( (2*((n/2) - (m/2)) + 1) % 2) ) )
或者
#define ABS(n) ( n * ( (2*n + 1) % 2) )  // Calculates abs value of n
#define MAX(n, m) ( (n/2) + (m/2) + ABS((n/2) - (m/2)) )  // Finds max between n & m
#define MIN(n, m) ( (n/2) + (m/2) - ABS((n/2) - (m/2)) )  // Finds min between n & m
于 2021-10-07T10:44:27.790 回答
0
//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;

}
于 2017-08-28T03:41:50.637 回答
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,反之亦然

于 2021-06-11T23:50:55.490 回答
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
于 2021-02-02T21:32:35.157 回答
-1

请看这个程序..这可能是迄今为止此页面上最好的答案...

#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;
}
于 2013-08-23T01:30:24.207 回答
-1
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;            
        }
    }
}
于 2021-02-22T05:26:58.760 回答
-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

关于什么:
在此处输入图像描述

平方根也是一个条件。无论何时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没有某种形式 就无法区分正数和负数。

于 2016-08-11T18:00:40.467 回答
-2

这取决于您使用的语言,但三元运算符可能很有用。

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

于 2009-09-03T20:55:58.227 回答
-3
#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
于 2009-10-16T10:34:00.430 回答