x上升到幂0不会评估为1

时间:2013-08-20 17:22:20

标签: c# math unit-conversion

我创建了一个用于执行单位转换的类,特别是字节到千字节,兆字节,千兆字节等。我有一个enum BPB,但出于某种原因{{ 1}}不返回1024^0并且它没有正确地从字节转换为字节或字节转换为千字节等。

这是我的班级:

1

以下语句应返回与public static class UnitConversion { /// <summary> /// 1024^n /// </summary> public enum ByteConversionConstant { B = 0, KB = 1, MB = 2, GB = 3, TB = 4, PB = 5 } public static string GetValueFromBytes(long bytes, ByteConversionConstant constant) { int n = (int)constant; long divisor = 1024^n; return (bytes / divisor).ToString() + Enum.GetName(typeof(ByteConversionConstant), constant); } } 完全相同的值,但由于fileInfo.Length未返回1024^0,因此它显示的是千字节数。注意,我在一行中都有1方法,但是我把它分开来看看可能导致错误计算的原因。

GetValueFromBytes

我不确定将UnitConversion.GetValueFromBytes(fileInfo.Length, UnitConversion.ByteConversionConstant.B) 强制转换为enum或将int提升为int并指定错误时是否会丢失是一个问题到int,但这是一种奇怪的行为。

5 个答案:

答案 0 :(得分:15)

您使用的是the ^ operator不是取幂运算符。它是异或。

使用Math.Pow进行取幂 - 或者更好,在这种情况下只使用位移:

long divided = bytes >> (n * 10);
return divided.ToString() + ...;

或者,您可以将枚举值更改为实际值除以:

public enum ByteConversionConstant : long
{
    B = 1L << 0,
    KB = 1L << 10,
    MB = 1L << 20,
    GB = 1L << 30,
    TB = 1L << 40,
    PB = 1L << 50
}

然后:

long divided = n / (long) constant;

答案 1 :(得分:7)

^XOR运算符。您想要实现的目标是通过Math.Pow完成的。

答案 2 :(得分:6)

^是一个按位运算符,您目前正在执行&#39; 1024 XOR 0&#39;。

我认为您正在寻找Math.Pow(1024, n);,这是&#39; 1024提升到0&#39;

答案 3 :(得分:3)

^运算符不会将数字提升到该幂,它是Bitwise XOR运算符。

您需要Math.Pow

long divisor = Math.Pow(1024, n);

答案 4 :(得分:0)

您应该使用Math.Pow()。

^不用于幂,而是用于按位运算(有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/zkacc7k1.aspx)。