数学上查找最高值,而条件比较
-
21-09-2019 - |
题
---------- ------------更新
codymanix和月影是一个很大的帮助迄今。我可以用公式来解决我的问题,而不是使用右移我由29由于签署2 ^ 31与32位分=溢出到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或任何条件语句。
为了找到的MAX值I只能执行以下功能
Divide, Multiply, Subtract, Add, NOT, AND ,OR
让我们说我有两个号
A = 60;
B = 50;
如果A总是比乙这将是简单的找到的最大值更大现在
MAX = (A - B) + B;
ex.
10 = (60 - 50)
10 + 50 = 60 = MAX
问题是一个不总是大于B.我无法与我使用的脚本应用程序了执行ABS,MAX,MIN或条件检查。
是否有使用上述受限工作找到非常接近最大值的值任何可能的方式?
解决方案
其他提示
我想这一个是最简单的,如果我们设法找到两个数字(仅幅度不签)
之间的区别max = ((a+b)+|a-b|)/2;
其中|a-b|
是a
和b
之间差的大小。
如果你不能信任你的环境下,生成相应的网点操作时,他们是否有空,看到的如何继续进行此页。注意,输入范围的限制;使用较大的整数类型的操作,如果你不能保证你的投入将适合。
解而不条件句。投为uint然后返回到int得到绝对
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); }
仅使用逻辑运算,短路评价并假定向零取整的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。这是可能做类似的伎俩,如果你的脚本语言遵循朝向地板价值像蟒蛇一样。
四舍五入的惯例嗯。我认为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)和(我的逻辑这里)
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;
尝试此,(但要注意对于溢出) (代码在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;
}
可以表达这种作为一系列算术和按位操作,e.g:
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;
}
请看看这个程序..这可能是最好的答案,直到日期此页......
这是#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;
}
//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;
}
这取决于你使用的语言,但三元运算符可能是有用的。
不过,如果你不能在你的“脚本程序”执行条件的检查,你可能没有三元运算符。
如果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
区分。
#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