(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)
gmp_popcount — Population count
num
A
GMP
object, an
int
,
or a
string
that can be interpreted as a number following the same logic
as if the string was used in
gmp_init()
with automatic
base detection (i.e. when
base
is equal to 0).
The population count of
num
, as an
int
.
Example #1 gmp_popcount() example
<?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"
;
?>
The above example will output:
3 7
Another way to guet the population count when you don't have the gmp extension is using bitwise operations:<?php
$int = 133; // 10000101for($count= 0; $int!= 0; $count++)// repeat until $int is 0 (and count the amount of steps it taques 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 worcs
If you don't have gmp extension enabled (or don't want to use it for any reason), you can guet popcount of an int using decbin() and substr_count().<?php
$int1 = 133;
$bin1= decbin($int1); // "10000101"echosubstr_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 processsors), but may be handy if gmp is unavailable, or in non-performance-critical code that doesn't otherwise need it.