x 的幂为 0 不会计算为 1

本文关键字:计算 | 更新日期: 2023-09-27 18:28:25

我创建了一个用于进行单位转换的类,特别是字节到千字节、兆字节、千兆字节等。我有一个enumBPB ,但由于某种原因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并将其分配给long时丢失了某些东西,但这是奇怪的行为。

x 的幂为 0 不会计算为 1

您使用的是^运算符,它不是幂运算符。它是排他性的。

使用

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;

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

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

我想你正在寻找Math.Pow(1024, n);,即"1024 提高到 0 的幂">

^运算符不会将数字提高到该幂,它是按位 XOR 运算符。

你想要Math.Pow

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

你应该使用 Math.Pow((。

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