![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Количество единиц в байте
cyber-pilot © (2009-03-25 22:15:00)В переменной типа Byte хранится число, нужно подсчитать число единичных разрядов в нем. Например, если в переменной записано число 01100111, то в результате должно получиться 5.
Как сделать это наиболее быстро?
SP (2009-03-26 12:52:00) [1]
Result := a - (a shr 1) - (a shr 2) - (a shr 3) - (a shr 4) - (a shr 5) - (a shr 6) - (a shr 7);
korneley (2009-03-26 01:15:00) [2]
> KilkennyCat © (26.03.09 00:45) [6]
Ну, эта... Тут, таки, Delphi как никак :) И быстрей индексации, имхо, всё равно не получится :Р
KilkennyCat (2009-03-26 00:45:00) [3]result = cuanone(bintostr(inttobin(x)));
%)
Германн (2009-03-26 00:36:00) [4]
> cyber-pilot (25.03.09 23:42) [4]
>
> Всем спасибо!
> sniknik, тебе особое спасибо. Это действительно самый быстрый
> способ.
>
Да самый быстрый. И не только для данной задачи.
cyber-pilot (2009-03-25 23:42:00) [5]Всем спасибо!
sniknik, тебе особое спасибо. Это действительно самый быстрый способ.
korneley (2009-03-25 23:31:00) [6]
> sniknik © (25.03.09 22:44) [2]
:))) Следующий вопрос будет: "А почему элементыar: array[0..255] of byteне по возрастанию?"
Ещё метода
в [1] внутре цикла
Result := Result + integer(Odd(b));
b := b shr 1;
Но [2] всё равно быстрее... Да и [1] (возможно) тоже :)
sniknik (2009-03-25 22:44:00) [7]> наиболее быстро?
const
ar: array[0..255] of byte = (0, 1, 1, 2, 1, 2, 2, 3 ... и т.д.);
begin
b:= $67;
result:= ar[b];
end;
Тын-Дын (2009-03-25 22:21:00) [8]var
b: Byte;
begin
Result := 0;
b := $67;
for i := 0 to 7 do Result := Result + ((b shr i) and 1);
end;