Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как? 
:(
    Опции темы
creation
Дата 4.6.2008, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 20.10.2007

Репутация: нет
Всего: нет



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

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

Но алгоритм медленный - проход в цикле...
Есть еще какие более простые?
PM MAIL   Вверх
mes
Дата 4.6.2008, 18:01 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(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 секунд
а вообше попробуй пользоваться поиском - найдешь много чего интересного


--------------------
PM MAIL WWW   Вверх
Fazil6
Дата 4.6.2008, 18:09 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



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

самый простой и быстрфй способ - задать массив нужной величины и занести в него подсчитанное значение для каждого числа, используя число как индекс. Потом просто по индексу доставать нужный результат
PM MAIL   Вверх
Alek86
Дата 4.6.2008, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



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 

Это сообщение отредактировал(а) Alek86 - 4.6.2008, 18:13


--------------------
user posted image    user posted image
PM MAIL   Вверх
creation
Дата 4.6.2008, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 20.10.2007

Репутация: нет
Всего: нет



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

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

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

Я думал есть какая нибудь одна формула, которая сможет выдать число единиц... smile
PM MAIL   Вверх
Alek86
Дата 4.6.2008, 18:14 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



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

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


--------------------
user posted image    user posted image
PM MAIL   Вверх
vinter
Дата 4.6.2008, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



bitset, vector<bool>


--------------------
Мой блог
PM MAIL WWW   Вверх
ama_kid
Дата 4.6.2008, 18:20 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

Репутация: 2
Всего: 95



Цитата(creation @  4.6.2008,  17:46 Найти цитируемый пост)
Есть еще какие более простые? 
Качаем книгу Алгоритмические трюки для программистов и читаем главу 5 "Подсчет битов" до просветления  smile 



--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
creation
Дата 4.6.2008, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 20.10.2007

Репутация: нет
Всего: нет



Цитата(ama_kid @ 4.6.2008,  18:20)
Цитата(creation @  4.6.2008,  17:46 Найти цитируемый пост)
Есть еще какие более простые? 
Качаем книгу Алгоритмические трюки для программистов и читаем главу 5 "Подсчет битов" до просветления  smile

Уже прочитал, уже реализовал... smile
Всем спасибо!
PM MAIL   Вверх
mes
Дата 4.6.2008, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(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 секунд
но решение приведенное в книжке более эффективное - тка как не обрашается к памяти ..


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0525 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.