Start · Sprachen · PHP · Referenz · gmp_popcount

gmp_popcount

Funktion

Zählt die Anzahl der gesetzten Bits (Bits mit dem Wert 1) in einer GMP-Zahl und gibt diese als Integer zurück.

seit PHP 4.0.4 Kategorie: math

Signatur

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

Beschreibung

gmp_popcount() berechnet die sogenannte Popcount (Population Count) einer ganzen Zahl – also die Anzahl der Bits, die in ihrer Binärdarstellung auf 1 gesetzt sind. Diese Operation wird auch als Hamming-Gewicht bezeichnet.

Die Funktion ist besonders nützlich in Bereichen wie Kryptographie, Codierung und Bit-Manipulation, wo es wichtig ist zu wissen, wie viele Bits in einer (potenziell sehr großen) Ganzzahl aktiv sind. Da die GMP-Bibliothek beliebig große Ganzzahlen unterstützt, kann gmp_popcount() im Gegensatz zu nativen PHP-Operatoren auch für Zahlen eingesetzt werden, die den Integer-Bereich von PHP überschreiten.

Bei negativen Zahlen ist das Verhalten zu beachten: GMP behandelt negative Zahlen intern im Zweierkomplement, sodass negative Zahlen konzeptionell unendlich viele gesetzte Bits besitzen. In der Praxis gibt die Funktion für negative Zahlen PHP_INT_MAX zurück (oder einen sehr großen Wert), da die Anzahl der gesetzten Bits als unendlich gilt.

Der Parameter kann als GMP-Objekt, als PHP-Integer oder als numerischer String übergeben werden, was die Integration in bestehende Berechnungen flexibel gestaltet.

Parameter

Name Typ Default Beschreibung
$num Pflicht GMP|int|string Die Zahl, deren gesetzte Bits gezählt werden sollen. Kann als GMP-Objekt, als PHP-int oder als numerischer String übergeben werden.

Rückgabewert

Typ
int
Beschreibung
Gibt die Anzahl der gesetzten Bits (Bits mit dem Wert 1) in der Binärdarstellung der übergebenen Zahl zurück. Der Rückgabewert ist immer ein nicht-negativer Integer. Bei negativen Zahlen wird ein sehr großer Wert (konzeptionell unendlich) zurückgegeben.

Beispiele

Popcount einfacher Zahlen berechnen

<?php
// Zahl 0: keine Bits gesetzt
echo gmp_popcount(0) . PHP_EOL; // 0

// Zahl 1 (binär: 1): ein Bit gesetzt
echo gmp_popcount(1) . PHP_EOL; // 1

// Zahl 7 (binär: 111): drei Bits gesetzt
echo gmp_popcount(7) . PHP_EOL; // 3

// Zahl 255 (binär: 11111111): acht Bits gesetzt
echo gmp_popcount(255) . PHP_EOL; // 8

// Zahl 256 (binär: 100000000): ein Bit gesetzt
echo gmp_popcount(256) . PHP_EOL; // 1
0 1 3 8 1

Popcount für sehr große Zahlen mit GMP

<?php
// Sehr große Zahl als String: 2^64 - 1 (alle 64 Bits gesetzt)
$bigNum = gmp_init('18446744073709551615');
echo gmp_popcount($bigNum) . PHP_EOL; // 64

// Hamming-Abstand zweier Zahlen berechnen
$a = gmp_init('0b10110110', 2); // binär
$b = gmp_init('0b01101001', 2); // binär
$xor = gmp_xor($a, $b);
$hammingDistance = gmp_popcount($xor);
echo 'Hamming-Abstand: ' . $hammingDistance . PHP_EOL;
64 Hamming-Abstand: 8

// Wichtig · Fallstricke

Negative Zahlen: Da negative Zahlen im Zweierkomplement unendlich viele gesetzte Bits besitzen, gibt gmp_popcount() für negative Eingaben einen sehr großen Wert zurück (in der Regel PHP_INT_MAX oder plattformabhängig den maximal darstellbaren Wert). Negative Zahlen sollten daher vor dem Aufruf entsprechend behandelt werden.

Voraussetzung: Die GMP-Erweiterung muss in der PHP-Installation aktiviert sein. Sie ist seit PHP 5.2 standardmäßig für die meisten Distributionen verfügbar, muss aber gegebenenfalls explizit aktiviert werden (extension=gmp in der php.ini).