Start · Sprachen · PHP · Referenz · gmp_testbit

gmp_testbit

Funktion

Prüft, ob ein bestimmtes Bit einer GMP-Zahl gesetzt ist, und gibt <code>true</code> oder <code>false</code> zurück.

seit PHP 5.6.0 Kategorie: math

Signatur

gmp_testbit(GMP|int|string $num, int $index): bool

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

Typ
bool
Beschreibung
Gibt 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
bool(false) bool(true) bool(false) bool(true)

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
bool(true) bool(false) bool(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";
}
Leserecht vorhanden Schreibrecht vorhanden Kein Adminrecht

// 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.