略微加速

PHP官方手册 - 互联网笔记

PHP - Manual: gmp_popcount

2024-05-03

gmp_popcount

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

gmp_popcountPopulation count

说明

gmp_popcount(GMP|int|string $num): int

Get the population count.

参数

num

GMP 对象或 int ,或数字string

返回值

The population count of num, as an int.

范例

示例 #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";
?>

以上例程会输出:

3
7
add a noteadd a note

User Contributed Notes 2 notes

up
0
ketrab2004
7 months ago
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 works
up
0
phpmanual at headbank dot co dot uk
3 years ago
If 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.

官方地址:https://www.php.net/manual/en/function.gmp-popcount.php

北京半月雨文化科技有限公司.版权所有 京ICP备12026184号-3