2017-01-02 68 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); 
} 

該方法需要很長時間。我可以優化它嗎?如何在此方法中優化數學運算?

+2

將其拆分爲單獨的語句並獲得體面的分析器來查看_which_部分需要「很長時間」。直到你這樣做,你只是猜測。 –

+2

你的方法實際上試圖實現什麼?它不利於我們不知道'GetIntFromBitArray'的作用... –

+0

@JonSkeet更新代碼。現在GetIntFromBitArray方法在這裏。 –

回答

1

你可以通過改變國防部2^64位和操作獲得良好的加速:

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

我想重複一下已經在評論中有人說,它看起來是像你想BigInteger這將允許您對任意大小的整數進行數學和比特級操作。

+0

非常好!這真的是加快我的代碼。現在最糟糕的地方 - GetIntFromBitArray方法。 –

+0

除了錯誤:(我說位移,我很困惑,它應該是零,但後面的64個字節。代碼更新。 – Stuart

+0

即使我的BitArray B長度爲64? 'BitArray B = new BitArray (64);' –