PHP эквивалент C кода от Bit Twiddling Hacks? - PullRequest
1 голос
/ 07 марта 2011

http://www -graphics.stanford.edu / ~ seander / bithacks.html # CountBitsSetParallel

v = v - ((v >> 1) & (T)~(T)0/3);      // temp 
v = (v & (T)~(T)0/15*3) + ((v >> 2) & (T)~(T)0/15*3);      // temp
v = (v + (v >> 4)) & (T)~(T)0/255*15;                      // temp
c = (T)(v * ((T)~(T)0/255)) >> (sizeof(v) - 1) * CHAR_BIT; // count

Это та же проблема в Python: Эквивалент Python кода C из Bit Twiddling Hacks?

Мне нужно использовать этот код в PHP независимо от целочисленного размера (приведенный выше код работает до 128-битных целых чисел, что мне подойдет). Вот что я попробовал:

function countSetBits($int) {
        $mask = (1 << PHP_INT_SIZE*8) - 1;
        $int = $int - (($int >> 1) & (int) $mask/3);
        $int = ($int & ((int) $mask/15)*3) + (($int >> 2) & ((int) $mask/15)*3);
        $int = ($int + ($int >> 4)) & ((int) $mask/255)*15;
        return ($mask & $int * ((int) $mask/255)) >> ((int) PHP_INT_SIZE - 1) * 8;
}

Причина, по которой это не работает (на 64-битной машине с 64-битным PHP - Debian Squeeze) заключается в том, что PHP, кажется, не поддерживает 64-битные целые числа без знака ( как получить 64-битное целое число) на PHP? ). Боюсь, мне придется использовать математическую библиотеку произвольной точности. Или есть другой способ?

Ответы [ 2 ]

2 голосов
/ 10 марта 2011

На данный момент это то, что я использовал:

    function countSetBits($int) {
            return substr_count(base_convert($int, 10, 2), '1');
    }
1 голос
/ 30 мая 2011

Попробуйте использовать следующее в вашем php-скрипте перед 64-битными операциями:

ini_set('precision', 20); 
...