Loading...
galants avatar galants 12 Точки

[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'.

Очаквам Вашите коментари.

Тагове:
2
Programming Basics
Lamms avatar Lamms 197 Точки

Здравейте, сега решавам тази задача, видях и в гуугъл, че има различни начини за преброяване на битовете. Аз като начинаеща, успях да измисля един, който обаче явно е доста тежък.

Можете ли да ми кажете дали задачата така ми е вярна, пък и макар не оптимизирана. В джъджа ми прехвърля времето.

http://pastebin.com/eHUyY6Tk

 

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.