Signatur
Beschreibung
gmp_setbit manipuliert ein einzelnes Bit einer GMP-Zahl an der durch $index angegebenen Position (0-basiert, d. h. Bit 0 ist das niedrigste Bit). Standardmäßig wird das Bit auf 1 gesetzt; durch Übergabe von false als dritten Parameter kann es auch auf 0 gelöscht werden.
Die Funktion arbeitet in-place: Das übergebene GMP-Objekt wird direkt verändert, es gibt keinen Rückgabewert. Das ist bei der Verwendung in Ausdrücken zu beachten – eine neue Variable wird nicht erzeugt.
Typische Anwendungsfälle sind Bit-Flag-Verwaltung bei sehr großen Ganzzahlen, die den Wertebereich der nativen PHP-Integer überschreiten, oder kryptographische und algorithmische Berechnungen, bei denen präzise Bitmanipulation auf beliebig großen Zahlen notwendig ist.
Um den aktuellen Wert eines Bits zu prüfen, kann gmp_testbit verwendet werden; zum Löschen eines Bits bietet sich alternativ gmp_clrbit an, das semantisch klarer ist als gmp_setbit($num, $index, false).
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $num Pflicht | GMP | Die GMP-Zahl, deren Bit verändert werden soll. Wird als Referenz übergeben und direkt modifiziert. |
|
| $index Pflicht | int | Der 0-basierte Index des zu setzenden oder zu löschenden Bits. Bit 0 entspricht dem niedrigstwertigen Bit (LSB). Negative Werte führen zu einem Fehler. | |
| $bit_on | bool | true | Gibt an, ob das Bit gesetzt (true) oder gelöscht (false) werden soll. |
Rückgabewert
GMP-Objekt.Beispiele
Bit in einer GMP-Zahl setzen
<?php
$num = gmp_init(0b00000000); // Binär: 0
echo 'Vorher: ' . gmp_strval($num, 2) . PHP_EOL;
gmp_setbit($num, 3); // Bit 3 setzen (Wert 8)
echo 'Nachher: ' . gmp_strval($num, 2) . PHP_EOL;
gmp_setbit($num, 0); // Bit 0 setzen (Wert 1)
echo 'Nachher: ' . gmp_strval($num, 2) . PHP_EOL;
echo 'Dezimal: ' . gmp_strval($num) . PHP_EOL;
Bit-Flag-Verwaltung mit GMP
<?php
// Berechtigungen als Bitmuster
$permissions = gmp_init(0);
// Bits für READ (0), WRITE (1), EXECUTE (2) setzen
gmp_setbit($permissions, 0); // READ
gmp_setbit($permissions, 1); // WRITE
echo 'Berechtigungen (binär): ' . gmp_strval($permissions, 2) . PHP_EOL;
echo 'READ aktiv: ' . (gmp_testbit($permissions, 0) ? 'ja' : 'nein') . PHP_EOL;
echo 'WRITE aktiv: ' . (gmp_testbit($permissions, 1) ? 'ja' : 'nein') . PHP_EOL;
echo 'EXEC aktiv: ' . (gmp_testbit($permissions, 2) ? 'ja' : 'nein') . PHP_EOL;
// WRITE-Berechtigung wieder entziehen
gmp_setbit($permissions, 1, false);
echo 'Nach Entzug von WRITE (binär): ' . gmp_strval($permissions, 2) . PHP_EOL;
// Wichtig · Fallstricke
In-place-Modifikation: Anders als viele andere GMP-Funktionen arbeitet gmp_setbit direkt auf dem übergebenen Objekt und gibt null/void zurück. Eine Zuweisung wie $result = gmp_setbit($num, 3) ergibt daher immer null in $result.
Negativer Index: Ein negativer Wert für $index führt seit PHP 7 zu einem ValueError bzw. in älteren Versionen zu einer Warnung. Stets sicherstellen, dass der Index >= 0 ist.
Zum gezielten Löschen eines Bits ist gmp_clrbit semantisch klarer und bevorzugt gegenüber gmp_setbit($num, $index, false).