(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)
gmp_popcount — Comptage de population
num
Un objet GMP , un entier,
ou un chaîne de caractères qui peut être interprété comme un nombre suivant la même logique
que si la chaîne était utilisée dans gmp_init() avec détection automatique de la base (c'est-à-dire lorsque base est égal à 0).
La population de num, sous la forme d'un int .
Exemple #1 Exemple avec gmp_popcount()
<?php
$pop1 = gmp_init("10000101", 2); // 3 1's
echo gmp_popcount($pop1) . "\n";
$pop2 = gmp_init("11111110", 2); // 7 1's
echo gmp_popcount($pop2) . "\n";
?>L'exemple ci-dessus va afficher :
3 7
Another way to get the population count when you don't have the gmp extension is using bitwise operations:
<?php
$int = 133; // 10000101
for($count = 0; $int != 0; $count++) // repeat until $int is 0 (and count the amount of steps it takes in $count)
{
$int = $int & $int-1; // remove the right most 1 from $int using the bitwise and operator
}
echo $count; // 3
?>
This is Kernighan's population count.
https://youtu.be/ZRNO-ewsNcQ?t=510 has a nice explanation on how it worksIf you don't have gmp extension enabled (or don't want to use it for any reason), you can get popcount of an int using decbin() and substr_count().
<?php
$int1 = 133;
$bin1 = decbin($int1); // "10000101"
echo substr_count($bin1, "1");
// Result: 3
?>
Being a string-comparison this is far less efficient than gmp_popcount() (for which there is a dedicated instruction on most if not all modern processors), but may be handy if gmp is unavailable, or in non-performance-critical code that doesn't otherwise need it.