如何在c#中实现这个python代码?
Python代码:
print(str(int(str("e60f553e42aa44aebf1d6723b0be7541"), 16)))
结果:
305802052421002911840647389720929531201
但是在c#中我遇到了大数字问题。
你能帮助我吗?
我在python和c#中得到了不同的结果。哪里可能是错误的?
答案 0 :(得分:19)
原始类型(例如Int32
,Int64
)的长度有限,对于这么大的数字来说还不够。例如:
Data type Maximum positive value Int32 2,147,483,647 UInt32 4,294,967,295 Int64 9,223,372,036,854,775,808 UInt64 18,446,744,073,709,551,615 Your number 305,802,052,421,002,911,840,647,389,720,929,531,201
在这种情况下,要表示该数字,您需要128位。对于.NET Framework 4.0,有一种新的数据类型可用于任意大小的整数System.Numerics.BigInteger。您不需要指定任何大小,因为它将由数字本身推断(这意味着您在执行时甚至可能获得OutOfMemoryException
,例如,乘以2非常大的数字)。
要回到您的问题,首先解析您的十六进制数字:
string bigNumberAsText = "e60f553e42aa44aebf1d6723b0be7541";
BigInteger bigNumber = BigInteger.Parse(bigNumberAsText,
NumberStyles.AllowHexSpecifier);
然后只需将其打印到控制台:
Console.WriteLine(bigNumber.ToString());
您可能有兴趣计算需要多少位来表示任意数字,使用此函数(如果我记得原始实现来自C Numerical Recipes):
public static uint GetNeededBitsToRepresentInteger(BigInteger value)
{
uint neededBits = 0;
while (value != 0)
{
value >>= 1;
++neededBits;
}
return neededBits;
}
然后计算一个以字符串形式写入的数字的大小:
public static uint GetNeededBitsToRepresentInteger(string value,
NumberStyles numberStyle = NumberStyles.None)
{
return GetNeededBitsToRepresentInteger(
BigInteger.Parse(value, numberStyle));
}
答案 1 :(得分:2)
如果您只想使用更大的数字,BigInteger
就会有很多数字。
答案 2 :(得分:0)
要查找存储BigInteger N
所需的位数,可以使用:
BigInteger N = ...;
int nBits = Mathf.CeilToInt((float)BigInteger.Log(N, 2.0));