PHP Conference Japan 2024

gmp_popcount

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

gmp_popcount统计位数

描述

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

获取位数。

参数

num

一个 GMP 对象,一个 int,或者一个 string,该字符串可以解释为数字,遵循与在 gmp_init() 中使用字符串并自动检测基数(即 base 等于 0 时)相同的逻辑。

返回值

int 形式返回 num 的位数。

示例

示例 #1 gmp_popcount() 示例

<?php
$pop1
= gmp_init("10000101", 2); // 3 个 1
echo gmp_popcount($pop1) . "\n";
$pop2 = gmp_init("11111110", 2); // 7 个 1
echo gmp_popcount($pop2) . "\n";
?>

以上示例将输出

3
7

添加注释

用户贡献注释 2 条注释

0
ketrab2004
3 年前
当您没有 gmp 扩展时,另一种获取位数的方法是使用按位运算

<?php

$int
= 133; // 10000101

for($count = 0; $int != 0; $count++) // 重复直到 $int 为 0(并在 $count 中计算它花费的步数)
{
$int = $int & $int-1; // 使用按位与运算符从 $int 中删除最右边的 1
}

echo
$count; // 3

?>

这是 Kernighan 的位数统计。

https://youtu.be/ZRNO-ewsNcQ?t=510 对其工作原理进行了很好的解释
0
phpmanual at headbank dot co dot uk
6 年前
如果您没有启用 gmp 扩展(或出于任何原因不想使用它),您可以使用 decbin() 和 substr_count() 获取 int 的位数。

<?php
$int1
= 133;
$bin1 = decbin($int1); // "10000101"
echo substr_count($bin1, "1");

// 结果:3
?>

作为字符串比较,这远不如 gmp_popcount() 高效(对于大多数如果不是所有现代处理器上的专用指令),但如果 gmp 不可用,或者在不那么关键的代码中不需要它,则可能很方便。
To Top