Start · Sprachen · PHP · Referenz · gmp_setbit

gmp_setbit

Funktion

Setzt oder löscht ein einzelnes Bit an einer bestimmten Position in einer <code>GMP</code>-Zahl.

seit PHP 4.0.4 Kategorie: math

Signatur

gmp_setbit(GMP &$num, int $index, bool $bit_on = true): void

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

Typ
void
Beschreibung
Die Funktion gibt keinen Wert zurück. Die Änderung erfolgt direkt am übergebenen 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;
Vorher: 0 Nachher: 1000 Nachher: 1001 Dezimal: 9

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;
Berechtigungen (binär): 11 READ aktiv: ja WRITE aktiv: ja EXEC aktiv: nein Nach Entzug von WRITE (binär): 1

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