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? ). Боюсь, мне придется использовать математическую библиотеку произвольной точности. Или есть другой способ?