Signatur
Beschreibung
gmp_testbit prüft, ob das Bit an Position $index (nullbasiert, von rechts gezählt) in der GMP-Zahl $num gesetzt ist. Das Ergebnis ist true, wenn das Bit den Wert 1 hat, andernfalls false.
Die Funktion gehört zur GMP-Erweiterung, die beliebig große ganze Zahlen verarbeiten kann. Sie ist besonders nützlich, wenn Bit-Masken oder Flags in sehr großen Ganzzahlen gespeichert werden, die den nativen PHP-Integer-Bereich übersteigen.
Der Parameter $index muss nicht-negativ sein; bei negativen Werten wird ein Fehler ausgelöst. Bit 0 ist das niederwertigste Bit (LSB), höhere Indizes entsprechen höherwertigen Bits.
Für Operationen auf Bit-Ebene mit normalen PHP-Integern genügen die eingebauten Bitoperatoren. gmp_testbit ist hingegen die richtige Wahl, sobald Zahlen jenseits von PHP_INT_MAX im Spiel sind.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $num Pflicht | GMP|int|string | Die zu prüfende Zahl. Kann ein GMP-Objekt, eine PHP-Ganzzahl oder ein String mit einer ganzen Zahl (dezimal oder hexadezimal mit Präfix 0x) sein. |
|
| $index Pflicht | int | Der nullbasierte Index des zu prüfenden Bits (0 = niedrigstes Bit). Muss >= 0 sein, andernfalls wird ein ValueError ausgelöst. |
Rückgabewert
true zurück, wenn das Bit an Position $index gesetzt ist, andernfalls false.Beispiele
Einfache Bit-Prüfung einer kleinen Zahl
<?php
// Dezimalzahl 10 = binär 1010
$zahl = gmp_init(10);
var_dump(gmp_testbit($zahl, 0)); // Bit 0 (Wert 1) → nicht gesetzt
var_dump(gmp_testbit($zahl, 1)); // Bit 1 (Wert 2) → gesetzt
var_dump(gmp_testbit($zahl, 2)); // Bit 2 (Wert 4) → nicht gesetzt
var_dump(gmp_testbit($zahl, 3)); // Bit 3 (Wert 8) → gesetzt
Bit-Prüfung bei einer sehr großen Zahl
<?php
// 2^64 = 18446744073709551616 (größer als PHP_INT_MAX auf 64-Bit-Systemen)
$gross = gmp_pow(2, 64);
// Bit 64 sollte gesetzt sein (da die Zahl genau 2^64 ist)
var_dump(gmp_testbit($gross, 64)); // true
var_dump(gmp_testbit($gross, 63)); // false
var_dump(gmp_testbit($gross, 0)); // false
Verwendung als Berechtigungsprüfung mit Bit-Flags
<?php
// Flags für Berechtigungen als Bit-Positionen
define('PERM_READ', 0);
define('PERM_WRITE', 1);
define('PERM_EXECUTE', 2);
define('PERM_ADMIN', 3);
// Benutzer hat Lesen und Schreiben (Bits 0 und 1 gesetzt) → dezimal 3
$berechtigungen = gmp_init(3);
if (gmp_testbit($berechtigungen, PERM_READ)) {
echo "Leserecht vorhanden\n";
}
if (gmp_testbit($berechtigungen, PERM_WRITE)) {
echo "Schreibrecht vorhanden\n";
}
if (!gmp_testbit($berechtigungen, PERM_ADMIN)) {
echo "Kein Adminrecht\n";
}
// Wichtig · Fallstricke
Negativer Index: Wird ein negativer Wert für $index übergeben, wirft PHP seit PHP 8.0 einen ValueError. In älteren Versionen wurde eine Warnung ausgegeben und false zurückgegeben.
Voraussetzung: Die GMP-Erweiterung muss installiert und aktiviert sein. Auf vielen Systemen ist sie standardmäßig verfügbar; andernfalls muss PHP mit --with-gmp kompiliert werden.
Für Zahlen im regulären Integer-Bereich sind native PHP-Bit-Operatoren wie & effizienter als der Overhead einer GMP-Funktion.