2012-03-02 1 views
3

Метод «Приращение» работает отлично. Но я хотел знать, есть ли более быстрый способ сделать это за меньшее количество шагов.Самый быстрый способ увеличить BitArray (двоичное число) на один?

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

Там один очень очевидное улучшение можно сделать: остановить, когда вы сделали!

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 петли всегда взывают к неизвестности.

Смежные вопросы