![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Количество бит в байте
Kerk © (2007-10-04 15:47:00)Прислали тут тестовое задание.. и есть там вот этот пунктик:
3. Напишите функцию, которая принимает на вход байт и возвращает кол-во установленных в нем битов.
Сделайте несколько вариантов функции:
а) Оптимизированной по скорости
б) Оптимизированной по памяти
в) Компромиссный вариант
----
Вижу оптимальным такой вариант:
function BitsInByte(B: Byte): Integer;
begin
Result := 0;
while B > 0 do
begin
Result := Result + (B and 1);
B := B shr 1;
end;
end;
Это видимо оптимизировано по памяти.. еще меньше памяти использовать невозможно. Какой же тогда оптимизированный по скорости? Ну можно забить массив (1, 2, 4, 8 .... ) и по нему в цикле пробиватьand'ом. Это памяти ест чуть больше, но не факт, что работает быстрее моего первого варианта. А компромиссный-то вариант какой? Что-то я запутался. Хелп плиз.
sniknik (2007-10-04 16:04:00) [81]> в) Компромиссный вариант
function BitsInByte(B: Byte): Integer;
begin
result:= byte(b and 1 > 0) + byte(b and 2 > 0) + byte(b and 4 > 0) + ...;
end;
Сергей М. (2007-10-04 16:01:00) [82]Удалено модератором
Kerk (2007-10-04 15:59:00) [83]
> sniknik © (04.10.07 15:56) [5]
Да да.. Я в [2] про это и сказал :)
Осталось компромиссный придумать
Kerk (2007-10-04 15:58:00) [84]Удалено модератором
sniknik (2007-10-04 15:56:00) [85]> Какой же тогда оптимизированный по скорости?
function BitsInByte(B: Byte): Integer;
const
mas: array[0.. ] of integer = (0, 1, ... );
begin
result:= mas[b];
end;
Сергей М. (2007-10-04 15:55:00) [86]
> по скорости - использовать таблицу
Емли xlat поможет, тот правильно подсказывают.
> компромиссный какой?
Смотря что подразумевать под "оптимизированный по памяти)..
shuang (2007-10-04 15:55:00) [87]>А компромиссный-то вариант какой?
с постоянной маской и рекурсией
Kerk (2007-10-04 15:52:00) [88]Как мне тут верно подсказывают, по скорости - использовать таблицу. :)
А компромиссный какой? :)
Сергей М. (2007-10-04 15:50:00) [89]По-моему, в строчке
> Result := Result + (B and 1);
ты нарисовал полную хню)
> Какой же тогда оптимизированный по скорости?
MBo(c) неоднократно предлагал такой вариант.