Компьютерный форум NoWa.cc

Компьютерный форум NoWa.cc (https://nowa.cc/index.php)
-   Borland C++ Builder (https://nowa.cc/forumdisplay.php?f=301)
-   -   Срочно! Помогите с алгоритмом (https://nowa.cc/showthread.php?t=182658)

drooker 24.09.2008 22:33

Срочно! Помогите с алгоритмом
 
Необходимо написать функцию на С++ которая вернет количество нулевых бит в символах строки, не считая символ конца строки. Написать 2 способами - быстрым и обычным.

Проблема в том что с С++ не знаком, только начал изучать а задача есть. Помогите плиз!!

drooker 29.09.2008 17:43

Re: Срочно! Помогите с алгоритмом
 
Всем спасибо!! Написал сам!!

/*Slow method*/
int CountZeroBits(const char* Str)
{
int Result = 0;
for (int i = 0; i < StrLen(Str); i++)
for (int j = 0; j <= 7; j++)
if (Str[i] & (1 << j) == 0) Result += 1;
return Result;
}

//fast method
int CountZeroBits(const char* Str)
{
const
byte CountBitsInTetra[16] =
{4, 3, 3, 2, 3, 2, 2, 1, 3, 2, 2, 1, 2, 1, 1, 0};
for (int i = 0; i < StrLen(Str); i++)
Result += CountBitsInTetra[Str[i] & 15] + CountBitsInTetra[Str[i] >> 4];
return Result;
}

joynter 02.07.2009 19:47

Re: Срочно! Помогите с алгоритмом
 
а что означает массив byte CountBitsInTetra[16] =
{4, 3, 3, 2, 3, 2, 2, 1, 3, 2, 2, 1, 2, 1, 1, 0}; ?
откуда цифры?

Eijler 13.04.2010 11:14

Re: Срочно! Помогите с алгоритмом
 
Я бы StrLen(Str) вынес из цикла ИМХО быстрее работать будет, если 4 байта памяти под инт не жалко

Mefik 21.06.2010 16:14

Re: Срочно! Помогите с алгоритмом
 
почему быстрее ?

ivan325 25.06.2010 04:00

Re: Срочно! Помогите с алгоритмом
 
так он уже сам написал :)

spartiat1010 08.12.2010 10:29

Re: Срочно! Помогите с алгоритмом
 
Цитата:

Сообщение от Eijler (Сообщение 3161190)
Я бы StrLen(Str) вынес из цикла ИМХО быстрее работать будет, если 4 байта памяти под инт не жалко

Так все-таки - почему быстрее? У самого есть подобное решение и не прочь его оптимизировать.

Andrew_1978 16.12.2010 09:15

Re: Срочно! Помогите с алгоритмом
 
В качестве второго варианта, более быстрого, но требующего больше памяти могу предложить:
вместо:
for (int j = 0; j <= 7; j++)
if (Str[i] & (1 << j) == 0) Result += 1;
return Result;
создаём массив из 256 чисел, каждое из которых соответствует число нулей в соответствующем числе.
Например,
unsigned char ZeroAmount [] = { 8, 7, 7, 6, 7, 6, 6, 5, ... и так далее. }

Добавлено через 3 минуты
Тогда число нулевых битов в каждом символе строки будет ZeroAmount[Str[i]]


Текущее время: 08:40. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2026, vBulletin Solutions, Inc. Перевод: zCarot
Copyright ©2004 - 2025 NoWa.cc

Время генерации страницы 0.02917 секунды с 9 запросами