[Homework] C# Basics - Operators-Expressions-and-Statements - Problem{21} - Bit Sifting
Здравейте колеги,
В условието на задачата е записано, че след превинаване на числото прес "ситото", трябва да се преброят битовете със стойност '1'. Първото което ми хрумна като идея е следното:
Вариант 1
int bitsCount = 0;
 ulong number = ulong.Parse(Console.ReadLine());
...
while(number > 0)
 {
      if(1==(number & 1))
                  bitsCount++;
 
      number = number>>1;
 }
но след допълнителни размишления и рефакторинг стигнах до др. два варианта на преброяването на '1'. Ето ги и тях:
Вариант 2
int bitsCount = 0;
ulong number = ulong.Parse(Console.ReadLine());
...
while (number > 0)
 {
      bitsCount += (number & 1);
      number = number >> 1;
 }
Вариант 3
int bitsCount = 0;
ulong number = ulong.Parse(Console.ReadLine());
...
while (number != 0)
 {
      number &= (number - 1);
      bitsCount += 1;
 }
Въпросът ми е кой от трите варианта е по-бърз и удачен?
Според мен първият вариант не е удачен тъй като има if конструкция, която намалява производителността на процесора, тъй като се нарушава конвейера от инструкции.
Третия вариант е удачен, но е малко труден за разбиране. (идеята за него ми дойде, когато разиграх възможностите на лист хартия).
Според мен най-удачният вариат е вторият, тъй като при него ако първият бит е '1' се добавя към брояча и след това се иместват битовете на дясно. Също така може много лесно да се направи да брои '0'.
Очаквам Вашите коментари.
