是否有一个简单的数学函数可用于比较数字x和y,当x小于y时返回-1,当x大于y时返回1,当它们相等时返回0?
如果没有,是否会有一个优雅的解决方案(没有任何if
)将Math.Max(x, y)
的输出转换为这些回报?我想把它们自己分开,例如123/123 = 1但这会引入除以0的问题。
答案 0 :(得分:29)
对于严格的-1,0或1要求,没有一种方法可以保证这样做。但是,您可以结合使用Int32.CompareTo
和Math.Sign
:
int value = Math.Sign(x.CompareTo(y));
或者,如果您对正数CompareTo
合同感到满意,该合约只是以负数,正数和0表示,您可以单独使用CompareTo
。
答案 1 :(得分:12)
您可以在不使用任何.NET调用和1行的情况下执行此操作。 注意:Math.Sign和type.CompareTo都使用你想要避免的逻辑if语句和比较运算符。
int result = (((x - y) >> 0x1F) | (int)((uint)(-(x - y)) >> 0x1F));
作为一个功能
//returns 0 if equal
//returns 1 if x > y
//returns -1 if x < y
public int Compare(int x, int y)
{
return (((x - y) >> 0x1F) | (int)((uint)(-(x - y)) >> 0x1F));
}
基本上,所有这一切都是SHIFT符号位一直到第一个位置。如果结果是无符号的,则它将为0;然后它执行相同的操作并翻转符号位,然后OR将它们放在一起,结果是1或0或-1。
结果为-1的情况
IS 12 > 15:
12 - 15 = -3 (11111111111111111111111111111101)
-3 >> 0x1F = -1 (11111111111111111111111111111111)
-(12 - 15) = 3 (00000000000000000000000000000011)
3 >> 0x1F = ((uint)0)=0 (00000000000000000000000000000000) cast to uint so 0
11111111111111111111111111111111
OR
00000000000000000000000000000000
= 11111111111111111111111111111111 (-1)
结果为1的情况
IS 15 > 12:
15 - 12 = 3 (00000000000000000000000000000011)
3 >> 0x1F = 0 (00000000000000000000000000000000)
-(15 - 12) = -3 (11111111111111111111111111111101)
-3 >> 0x1F = ((uint)-1)=1 (00000000000000000000000000000001) cast to uint so 1
00000000000000000000000000000000
OR
00000000000000000000000000000001
= 00000000000000000000000000000001 (1)
结果为0的情况
IS 15 == 15:
15 - 15 = 0 (00000000000000000000000000000000)
0 >> 0x1F = 0 (00000000000000000000000000000000)
-(15 - 15) = 0 (00000000000000000000000000000000)
0 >> 0x1F = ((uint)0)=0 (00000000000000000000000000000000) cast to uint so 1
00000000000000000000000000000000
OR
00000000000000000000000000000000
= 00000000000000000000000000000000 (0)
这也应该比使用Math或任何其他.NET方法的任何调用快得多。
答案 2 :(得分:6)
x.CompareTo(y)
直接来自MSDN。
答案 3 :(得分:2)
这是Math.Sign()函数。
像这样:
return Math.Sign(x-y);
答案 4 :(得分:2)
使用CompareTo()
功能
int i = 5;
int n = 6;
int c = i.CompareTo(n);
我通常在if
语句中使用它:
int x = 34;
int y = 25;
if(x.CompareTo(y) == 0)
{
Console.WriteLine("Yes, they are equal");
}
else
{
Console.WriteLine("No, they are not equal");
}
编辑:
有些人声称Int32.CompareTo()可以返回-1 | 0 | 1以外的东西,我决定自己研究这种可能性。
以下是Int32.CompareTo()
的反映代码。我没有看到任何一个人除了-1 | 0 | 1之外都会返回任何东西。
[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
public int CompareTo(int value)
{
if (this < value)
{
return -1;
}
if (this > value)
{
return 1;
}
return 0;
}
public int CompareTo(object value)
{
if (value == null)
{
return 1;
}
if (!(value is int))
{
throw new ArgumentException(Environment.GetResourceString("Arg_MustBeInt32"));
}
int num = (int) value;
if (this < num)
{
return -1;
}
if (this > num)
{
return 1;
}
return 0;
}
答案 5 :(得分:0)
您可以尝试使用此代码
var result = a.CompareTo(b);
答案 6 :(得分:0)
对整数使用CompareTo方法:
public int c(int x, int y)
{
return x.CompareTo(y);
}
void Main()
{
Console.WriteLine(c(5,3));
Console.WriteLine(c(3,3));
Console.WriteLine(c(1,3));
}
答案 7 :(得分:0)
您尝试过compareTo()
吗?看这里:http://msdn.microsoft.com/en-us/library/y2ky8xsk.aspx