[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'.
Очаквам Вашите коментари.