Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как?


Автор: creation 4.6.2008, 17:46
Нужно создать быстрый алгоритм для подсчета числа 1 и 0 в десятичном числе...
Т. е. есть число, например, 8 - в двоичном виде это 1000
И надо определить число 1 и 0 в двоичном виде... Т. е. одна единица три нуля.

Самый первый, который пришел в голову - это в цикле делать смещение бита на первое место (правое), обнулять остальные биты и проверять что получили 1 или 0 и считать...

Но алгоритм медленный - проход в цикле...
Есть еще какие более простые?

Автор: mes 4.6.2008, 18:01
Цитата(creation @  4.6.2008,  17:46 Найти цитируемый пост)
Нужно создать быстрый алгоритм для подсчета числа 1 и 0 в десятичном числе...


для 8битного числа возврашает кол-во единиц.
Код

size_t  func (byte source) 
{
return    ((source & 128) >>7)
            +  ((source &  64) >>6)
            +  ((source &  32) >>5)
            +  ((source & 16) >>4)
            +  ((source & 8)  >>3)
            +  ((source & 4)  >>2)
            +  ((source & 2)  >>1)
            +  ((source & 1) );
};
кол-во нулей узнается путем вычета результа из длины (8)

Добавлено через 57 секунд
за сегодня третий вопрос по битовым операциям.. )) 

Добавлено через 2 минуты и 28 секунд
название у темы крутое..такое понятное и ясное.. аж на душе приятно

Добавлено через 3 минуты и 14 секунд
а вообше попробуй пользоваться поиском - найдешь много чего интересного

Автор: Fazil6 4.6.2008, 18:09
Цитата(creation @  4.6.2008,  17:46 Найти цитируемый пост)
Но алгоритм медленный - проход в цикле...
Есть еще какие более простые? 

самый простой и быстрфй способ - задать массив нужной величины и занести в него подсчитанное значение для каждого числа, используя число как индекс. Потом просто по индексу доставать нужный результат

Автор: Alek86 4.6.2008, 18:11
http://forum.vingrad.ru/forum/topic-210832/view-all.html
с помощью одного из тех вариантов решения, думаю, можно ускорить решение mes'а

Добавлено @ 18:12
Цитата(Fazil6 @  4.6.2008,  18:09 Найти цитируемый пост)
задать массив нужной величины

для инта жесткий массив будет
лучше уж по байтам разбивать число и массив из 256 элементов

Добавлено @ 18:13
 smile 
представил, как программер вводит значения для массива на 4 мильярда элементов
 smile 

Автор: creation 4.6.2008, 18:13
Спасибо mes!
Но это тот же алгоритм, что и мой... smile
У тебя цикла нет, просто... smile

Насчет занести в массив числа с нужным количеством 1 и 0 хорошая идея, но ресурсоемкая, так как массивы будут очень большие...
Нужен быстрый способ, расчета на лету...

В целом понимаю, что скорее всего придеться использовать то, что в голову самому и пришло и что тоже самое немного по другому оформил mes... smile

Я думал есть какая нибудь одна формула, которая сможет выдать число единиц... smile

Автор: Alek86 4.6.2008, 18:14
Цитата(creation @  4.6.2008,  18:13 Найти цитируемый пост)
ресурсоемкая, так как массивы будут очень большие...

если по байтам разбить, то в самый раз

Автор: vinter 4.6.2008, 18:17
bitset, vector<bool>

Автор: ama_kid 4.6.2008, 18:20
Цитата(creation @  4.6.2008,  17:46 Найти цитируемый пост)
Есть еще какие более простые? 
Качаем книгу http://www.proklondike.com/file/CompScience/Warren_-_Algoritmicheskie_Tryuki_Programmistov.rar и читаем главу 5 "Подсчет битов" до просветления  smile 

Автор: creation 4.6.2008, 18:43
Цитата(ama_kid @ 4.6.2008,  18:20)
Цитата(creation @  4.6.2008,  17:46 Найти цитируемый пост)
Есть еще какие более простые? 
Качаем книгу http://www.proklondike.com/file/CompScience/Warren_-_Algoritmicheskie_Tryuki_Programmistov.rar и читаем главу 5 "Подсчет битов" до просветления  smile

Уже прочитал, уже реализовал... smile
Всем спасибо!

Автор: mes 4.6.2008, 18:45
Цитата(creation @  4.6.2008,  18:13 Найти цитируемый пост)
Насчет занести в массив числа с нужным количеством 1 и 0 хорошая идея, но ресурсоемкая, так как массивы будут очень большие...

вот противопример :
size_t func (int16 source )  {
static size_t bits4count[] = { 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3, 4 };
           return bits4count[bits4count[ ( source) & 0xff ] )
                    +bits4count[bits4count[ ( source >>4) & 0xff ] )
                   +bits4count[bits4count[ ( source >> 8) & 0xff ] )
                   +bits4count[bits4count[ ( source >>12) & 0xff ] );
}

Добавлено через 6 минут и 56 секунд
но решение приведенное в книжке более эффективное - тка как не обрашается к памяти ..

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)