2017-01-02 1 views
2
public static BitArray ShLo(BitArray B) 
{ 
    return new BitArray(System.BitConverter.GetBytes(Math.Floor((GetIntFromBitArray(B)/2) % (Math.Pow(2, 64))))); 
} 
private static ulong GetIntFromBitArray(BitArray bitArray) 
{ 
    var array = new int[2]; 
    bitArray.CopyTo(array, 0); 
    return (uint)array[0] + ((ulong)(uint)array[1] << 32); 
} 

Diese Methode dauert sehr lange. Kann ich es optimieren?Wie kann ich mathematische Operationen in dieser Methode optimieren?

+2

Teilen Sie es in separate Anweisungen und erhalten Sie einen anständigen Profiler zu sehen _which_ Teil dauert "eine lange Zeit". Bis du das tust, rätselst du nur. –

+2

Was versucht Ihre Methode eigentlich zu erreichen? Es hilft nicht, dass wir nicht wissen, was 'GetIntFromBitArray' tut ... –

+0

@JonSkeet Update-Code. Jetzt GetIntFromBitArray-Methode hier. –

Antwort

1

Sie können eine gute Geschwindigkeit bis erhalten, indem die mod 2^64 auf ein Bit und den Betrieb zu ändern:

public static BitArray ShLo(BitArray B) 
{ 
    return new BitArray(BitConverter.GetBytes(Math.Floor((double)((GetIntFromBitArray(B)/2) & Int64.MaxValue)))); 
} 

Ich würde wiederholen, was in den Kommentaren gesagt wurde, was es sieht aus wie Sie BigInteger wollen Damit können Sie mathematische Operationen und Bit-Level-Operationen auf beliebigen Ganzzahlen ausführen.

+0

Ausgezeichnet! Es beschleunigt meinen Code wirklich. Und jetzt schlimmster Ort - GetIntFromBitArray-Methode. –

+0

Außer es war falsch :(Ich sagte Bit-Shift, ich war verwirrt, sollte es alles außer den hinteren 64 Bytes Null sein. Der Code ist aktualisiert. – Stuart

+0

auch wenn mein BitArray B eine Länge 64 haben? 'BitArray B = neue BitArray (64); –

Verwandte Themen