PHP эквивалент C кода от Bit Twiddling Hacks?
http://www-graphics.stanford.edu/~seander/bithacks.html
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 ответа
На данный момент это то, что я использовал:
function countSetBits($int) {
return substr_count(base_convert($int, 10, 2), '1');
}
Попробуйте использовать следующее в вашем php-скрипте перед 64-битными операциями:
ini_set('precision', 20);