2012-04-24 14 views
7

Wie kann ich diesen Python-Code in C# implementieren?beliebig große ganze Zahlen in C#

Python-Code:

print(str(int(str("e60f553e42aa44aebf1d6723b0be7541"), 16))) 

Ergebnis:

305802052421002911840647389720929531201 

Aber in C# Ich habe Probleme mit großen Ziffern.

Können Sie mir helfen?

Ich habe unterschiedliche Ergebnisse in Python und C#. Wo kann ein Fehler sein?

Antwort

18

Primitive Typen (wie Int32, Int64) haben eine endliche Länge, die für eine so große Zahl nicht ausreicht. Zum Beispiel:

 
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 

In diesem Fall, dass die Zahl darstellen würden Sie 128 Bits benötigen. Mit .NET Framework 4.0 gibt es einen neuen Datentyp für beliebig große ganze Zahlen System.Numerics.BigInteger. Sie müssen keine Größe angeben, da durch die Zahl abgeleitet wird (es bedeutet, dass Sie sogar eine OutOfMemoryException erhalten können, wenn Sie beispielsweise eine Multiplikation von zwei sehr großen Zahlen durchführen).

Um auf Ihre Frage zurückkommen, zuerst Ihre Hexadezimalzahl analysieren:

string bigNumberAsText = "e60f553e42aa44aebf1d6723b0be7541"; 
BigInteger bigNumber = BigInteger.Parse(bigNumberAsText, 
    NumberStyles.AllowHexSpecifier); 

Dann drucken Sie es einfach zu trösten:

Console.WriteLine(bigNumber.ToString()); 

Sie interessiert sein, wie viele Bits müssen Sie berechnen, stellen Sie eine willkürliche Zahl dar, benutzen Sie diese Funktion (wenn ich mich gut erinnere, ursprüngliche Implementierung kommt von C-numerischen Rezepten):

public static uint GetNeededBitsToRepresentInteger(BigInteger value) 
{ 
    uint neededBits = 0; 
    while (value != 0) 
    { 
     value >>= 1; 
     ++neededBits; 
    } 

    return neededBits; 
} 

Dann wird die erforderliche Größe einer Zahl zu berechnen als String schrieb:

Sie
public static uint GetNeededBitsToRepresentInteger(string value, 
    NumberStyles numberStyle = NumberStyles.None) 
{ 
    return GetNeededBitsToRepresentInteger(
     BigInteger.Parse(value, numberStyle)); 
} 
+0

Dank! Es klappt! Aber gibt falsches Ergebnis zurück, es ist eine Frage der Zeit. vielleicht ... =) – pic0