この python コードを c# で実装するにはどうすればよいですか?
Python コード:
print(str(int(str("e60f553e42aa44aebf1d6723b0be7541"), 16)))
結果:
305802052421002911840647389720929531201
しかし、c# では大きな数字に問題があります。
手伝って頂けますか?
Python と C# で異なる結果が得られました。どこが間違っている可能性がありますか?
この python コードを c# で実装するにはどうすればよいですか?
Python コード:
print(str(int(str("e60f553e42aa44aebf1d6723b0be7541"), 16)))
結果:
305802052421002911840647389720929531201
しかし、c# では大きな数字に問題があります。
手伝って頂けますか?
Python と C# で異なる結果が得られました。どこが間違っている可能性がありますか?
プリミティブ型 ( Int32
、などInt64
) には有限の長さがあるため、このような大きな数には十分ではありません。例えば:
データ型 正の最大値 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 あなたの番号 305,802,052,421,002,911,840,647,389,720,929,531,201
この場合、その数値を表すには 128 ビットが必要です。.NET Framework 4.0 には、任意のサイズの整数System.Numerics.BigInteger用の新しいデータ型があります。数値自体によって推測されるため、サイズを指定する必要はありません(つまりOutOfMemoryException
、2 つの非常に大きな数値の乗算などを実行したときに が得られることもあります)。
質問に戻るには、まず 16 進数を解析します。
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));
}
より大きな数を使用できるようにしたい場合はBigInteger
、桁数の多いものがあります。
を格納するために必要なビット数を見つけるにはBigInteger N
、次を使用できます。
BigInteger N = ...;
int nBits = Mathf.CeilToInt((float)BigInteger.Log(N, 2.0));