1

我创建了一个用于进行单位转换的类,特别是字节到千字节、兆字节、千兆字节等。我有一个enumwith Bthrough PB,但由于某种原因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)

我不确定将 a 转换enum为 an是否存在问题,或者在将 an 提升到 an并将其分配给 aint时是否会丢失某些内容,但这是一种奇怪的行为。intintlong

4

5 回答 5

15

您正在使用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;
于 2013-08-20T17:24:36.293 回答
7

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

于 2013-08-20T17:24:04.993 回答
6

^是位运算符,您当前正在执行“1024 XOR 0”。

我想您正在寻找Math.Pow(1024, n);'1024 的 0 次幂'

于 2013-08-20T17:24:31.320 回答
3

The ^ operator does not raise the number to that power, it is the Bitwise XOR operator.

You want Math.Pow

long divisor = Math.Pow(1024, n);
于 2013-08-20T17:26:18.760 回答
0

您应该使用 Math.Pow()。

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

于 2013-08-20T17:30:14.713 回答