----------更新------------
到目前为止,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或条件检查。
是否有可能使用上面的限制操作找到非常接近最大值的值?
答案 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|
是a
和b
之间差异的大小。
答案 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
当 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
平方根也是一个条件。每当c>0
和c^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