|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Yuriy Kaminskiy 2:5020/517.21 23 Feb 2001 11:55:27 To : Alexander Babanov Subject : Re: Задачка ;) -------------------------------------------------------------------------------- >>>>> On 21:52 21/2/2001, Alexander Babanov <2:5020/5609.69> writes: AB> Тут жену как-то спросили как на сях посчитать число еденичек в бинарном AB> представлении числа. Hу, на сях писать было в ломы, я решил попробовать AB> на эхотаге. Вот более-менее отличающиеся друг от друга варианты: use integer; sub hweight($) { my($x)=@_; my $res=0; # hint: operation $x &= ($x-1) drops least sign. bit in $x $res++, $x &= $x-1 while($x); return $res; } sub hweight32($) { my($w)=@_; # на C этот вариант будет быстрее [нет условных переходов!]; на perl - х.з. my $res = ($w & 0x55555555) + (($w >> 1) & 0x55555555); $res = ($res & 0x33333333) + (($res >> 2) & 0x33333333); $res = ($res & 0x0F0F0F0F) + (($res >> 4) & 0x0F0F0F0F); $res = ($res & 0x00FF00FF) + (($res >> 8) & 0x00FF00FF); return ($res & 0x0000FFFF) + (($res >> 16) & 0x0000FFFF); } # аналогично определяются hweight16 и hweight8; # см. /usr/include/linux/bitops.h -- Yuriy Kaminskiy. --- Gnus v5.2.25/XEmacs 19.14 * Origin: Kyle Katan's station (2:5020/517.21@fidonet) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/17427fba5731e.html, оценка из 5, голосов 10
|