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

Cam*_*ker 1 c# math unit-conversion

我创建了做单位转换类,具体字节来千字节,兆字节,千兆,等我有一个enumB通过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);
    }
}
Run Code Online (Sandbox Code Playgroud)

以下语句应返回与之完全相同的值fileInfo.Length,但由于1024^0未返回1,因此它显示的是千字节数.注意,我将GetValueFromBytes方法全部放在一行中,但是我把它分开来看看可能导致错误计算的原因.

UnitConversion.GetValueFromBytes(fileInfo.Length, 
                                 UnitConversion.ByteConversionConstant.B)
Run Code Online (Sandbox Code Playgroud)

我不确定这是一个问题,如果enum把一个int东西弄到一个或者当一个东西在一个东西上升int到一个int并分配给它时会丢失long,但这是一种奇怪的行为.

Jon*_*eet 15

您正在使用^运营商,这是不是一个幂运算符.它是异或的.

使用Math.Pow乘方-或更好,只是使用位移位在这种情况下:

long divided = bytes >> (n * 10);
return divided.ToString() + ...;
Run Code Online (Sandbox Code Playgroud)

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

public enum ByteConversionConstant : long
{
    B = 1L << 0,
    KB = 1L << 10,
    MB = 1L << 20,
    GB = 1L << 30,
    TB = 1L << 40,
    PB = 1L << 50
}
Run Code Online (Sandbox Code Playgroud)

然后:

long divided = n / (long) constant;
Run Code Online (Sandbox Code Playgroud)


Dan*_*rth 7

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

  • 好吧,我们得到了Skeet'd. (2认同)

Pie*_*ult 6

^ 是一个按位运算符,您当前正在执行'1024 XOR 0'.

我认为你在寻找Math.Pow(1024, n);,这是'1024提升到0的力量'