2012-03-02 6 views
3

次の「インクリメント」メソッドは完全に動作しています。しかし、これをより少ないステップで行うためのより速い方法があるかどうかを知りたがっていました。BitArray(2進数)を1つずつインクリメントする最速の方法は?

public BitArray Increment(BitArray bArray) 
    { 
     carry = true; 

     for (i = 0; i < 32; i++) 
     { 
      if (carry) 
      { 
       if (bArray[i] == false) 
       { 
        bArray[i] = true; 
        carry = false; 
       } 
       else 
       { 
        bArray[i] = false; 
        carry = true; 
       } 
      } 
     } 
     return bArray; 
    } 

おかげで....

+3

あなたの状況に適した 'BigInteger'クラスはありますか? http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.aspx –

+0

これには 'BigInteger'を使うべきです。 –

答えて

4

あなたが作ることができる1点の非常に明白な改善があります:あなたが完了したら、停止!

public void Increment(BitArray bArray) 
{ 
    for (int i = 0; i < 32; i++) 
    { 
     bool previous = bArray[i]; 
     bArray[i] = !previous; 
     if (!previous) 
     { 
      // Found a clear bit - now that we've set it, we're done 
      return; 
     } 
    } 
} 

また、あなたが本当には32ビットのみを得た(としか32ビットになります)している場合は、その理由だけではなく、intを使用していませんか? を増やすと、は本当に簡単です!必要に応じて、独自のカスタム構造体でいつでもラップすることができます。

1

あなたは確かに少ないステップと分岐無しでこれを書くことができます。

bool newbit = bArray[i]^carry; 
carry = bArray[i] & carry; 
bArray[i] = newbit; 

コードのこのビットは、全加算器だけでなく、インクリメンタに一般化することができます。オーバーフロー処理なし

0

for (int i = 0; i < 32 && !(bitArray[i] = !bitArray[i++]);); 

C由来forループは常にあいまいのために叫びます。