2024 年日本 PHP 研討會

gmp_popcount

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

gmp_popcount位元計數

說明

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

取得位元計數 (population count)。

參數

num

一個 GMP 物件、一個 int 整數,或是一個可以被解釋為數字的 string 字串,其遵循與在 gmp_init() 中使用字串並啟用自動進位偵測(即 base 參數等於 0)相同的邏輯。

返回值

num 的位元計數,以 int 整數型態返回。

範例

範例 #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 則筆記

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 有一個很好的解釋說明它是如何運作的。
phpmanual at headbank dot co dot uk
6 年前
如果您沒有啟用 gmp 擴充功能(或者基於任何原因不想使用它),您可以使用 decbin() 和 substr_count() 獲取整數的位元計數。

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

// 結果:3
?>

作為字串比較,這種方法的效率遠低於 gmp_popcount()(大多數現代處理器,即使不是全部,都有專用的指令),但如果 gmp 無法使用,或者在非效能關鍵的程式碼中,而且不需要 gmp 的其他功能,則可能很方便。
To Top