x 的幂为 0 不会计算为 1
本文关键字:计算 | 更新日期: 2023-09-27 18:28:25
我创建了一个用于进行单位转换的类,特别是字节到千字节、兆字节、千兆字节等。我有一个enum
,B
到 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)
我不确定这是否是将enum
投射到int
的问题,还是在将int
提升到int
并将其分配给long
时丢失了某些东西,但这是奇怪的行为。
您使用的是^
运算符,它不是幂运算符。它是排他性的。
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(。