2011-03-07 2 views
1

http://www-graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallelBit Twiddling Hacks의 C 코드와 PHP 코드가 같습니까?

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 

이 파이썬에서 같은 문제 : 나는 독립적으로 정수 크기에서, PHP에서이 코드를 사용할 필요가 Python equivalent of C code from Bit Twiddling Hacks?

(위의 코드는 것, 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 비트 PHP와 64 비트 시스템에 - 데비안 짜기가) PHP는 (64 비트 부호없는 정수를 지원하지 않는 것이다 how to have 64 bit integer on PHP?). 필자는 임의 정밀도 수학 라이브러리를 사용해야 할 것입니다. 아니면 다른 방법이 있습니까?

답변

2

지금, 이것은 내가 사용하는 것입니다 :

function countSetBits($int) { 
      return substr_count(base_convert($int, 10, 2), '1'); 
    } 
+0

이 어쨌든 아마 더 효율적입니다. 해석 된 언어에서는 2 개 이상의 연산자를 사용하는 것보다 2 개의 기본 함수를 호출하는 것이 좋습니다. 또한 ['decbin'] (http://php.net/manual/en/function.decbin.php)을 사용해보십시오. – aaz

1

한번에 64 비트 운영하기 전에 당신의 PHP 스크립트에 다음을 사용 :

ini_set('precision', 20);