Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.02;
Скачать: CL | DM;

Вниз

Биты   Найти похожие ветки 

 
ArtemESC   (2005-08-17 19:27) [0]

Доброго времени суток...
Какой самый быстрый алгоритм подсчета количества нулей
и единиц в структуре или, хотя-бы в байте можете предложить?
Например: 01110001 -> 1 ноль
                      потом 3 единицы
                      потом 3 нуля
                      1 единица
Алгоритм хотелось бы сделать максимально быстрым,
поскольку операция будет с большими участками памяти.
Заранее спасибо!!!


 
Alexander Panov ©   (2005-08-17 19:32) [1]

Использовать массив с возможными комбинациями битов в байте.


 
GLFox ©   (2005-08-17 19:38) [2]

Для подсчета количества единичных битов я пользуюсь такой функцией:

function Bin32GetFlagCount(uFlags: Cardinal): Cardinal;
begin
 Result := uFlags - ((uFlags shr 1) and $55555555);
 Result := (Result and $33333333) + ((Result shr 2) and $33333333);
 Result := (Result + (Result shr 4)) and $0f0f0f0f;
 Result := Result + (Result shr 8);
 Result := Result + (Result shr 16);
 Result := Result and $0000003f;
end;

А вообще, читай книгу "Hacker"s Delight" автора Henry S. Warren, Jr.


 
KilkennyCat ©   (2005-08-17 19:42) [3]

[1] шустрее.


 
GLFox ©   (2005-08-17 19:46) [4]

>KilkennyCat ©   (17.08.05 19:42) [3]

Однако! Для 32-битного значения делать массив с 2^32 комбинациями, думаю накладнее будет...


 
KilkennyCat ©   (2005-08-17 19:47) [5]


> 32-битного

???


 
Alexander Panov ©   (2005-08-17 20:03) [6]

GLFox ©   (17.08.05 19:38) [2]
GLFox ©   (17.08.05 19:46) [4]

Вопрос о байте.
Следовательно массив будет состоять из 256 значений.


 
ArtemESC   (2005-08-17 20:09) [7]

>>Alexander Panov
>>Вопрос о байте.
Байт - это только для примера, который я
хотел получить от вас...В действительности
структуры будут довольно-таки большие.
Вот в чем дело. Как ускорить этот процесс???
Извеняюсь за требовательность, но очень нужно...


 
Alexander Panov ©   (2005-08-17 20:15) [8]

ArtemESC   (17.08.05 20:09) [7]
Вопрос надо задавать как следует, так как из условий задачи следует ее решение. А в случае поиска оптимальных решений частное не верно для общего в большинстве случаев.

Что касается новых условий, то получение количества битов побайтно(при условии оптимального решения для байта), как мне кажется, даст наибольшую производительность.


 
KilkennyCat ©   (2005-08-17 20:15) [9]


> Байт - это только для примера


не только. Байт - это минимум. 32 бита проверятся четыре раза по байту.


 
Digitman ©   (2005-08-18 12:58) [10]


> ArtemESC   (17.08.05 19:27)


самый быстрый алгоритм - с использованием таблиц преобразования.

но при использовании оного выигрывая в производительности кода ты ОЩУТИМО проигрываешь в размере данных, требуемых для работы алгоритма.


 
TStas ©   (2005-08-19 19:41) [11]

А нельзя использовать TStringStream? Число единиц и нулей ведь в байтах заранее известно. Сохранить в TStringStream и перебрать все байты в полученной строке. Или это не быстрый способ?


 
Наиль ©   (2005-08-19 22:59) [12]

>[11]
По-моему, этот способ быстрый, если не учитывать стыки между байтами. Для учёта стыков придётся запоминать сколько и чего в начале и в конце байта. Потом суммировать длины совпадающих концов соседних байт. Плюс контроль за числами $00 и $FF, которые являются соеденительными между другими байтами. Stream для этого подойдёт любой. При грамотной реализации этот метод может оказаться самым быстрым.



Страницы: 1 вся ветка

Текущий архив: 2005.10.02;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.053 c
14-1126250989
pavel_guzhanov
2005-09-09 11:29
2005.10.02
Предложение или просьба к модераторам


14-1126693209
Ксардас
2005-09-14 14:20
2005.10.02
Дайте ссылку на последние новости из Нового Орлеана


3-1124342583
ААР
2005-08-18 09:23
2005.10.02
список пользователей базы


1-1126269631
Дмитрий_05
2005-09-09 16:40
2005.10.02
Область изображения


1-1126342160
html_
2005-09-10 12:49
2005.10.02
Нужен совет по созданию HTML-редактора