Start · Sprachen · PHP · Referenz · gmp_clrbit

gmp_clrbit

Funktion

Löscht (setzt auf 0) ein einzelnes Bit an einer bestimmten Position in einer GMP-Zahl.

seit PHP 4.0.4 Kategorie: math

Signatur

gmp_clrbit(GMP|int|string &$num, int $index): void

Beschreibung

gmp_clrbit löscht das Bit an der durch index angegebenen Position in der GMP-Zahl num, d. h. es setzt dieses Bit auf 0. Der Parameter num wird direkt modifiziert (Referenz).

Die Funktion ist nützlich, wenn auf Bit-Ebene mit großen ganzen Zahlen gearbeitet wird – etwa bei kryptographischen Algorithmen, Berechtigungsmasken oder Protokoll-Implementierungen, bei denen Einzelbits gezielt zurückgesetzt werden müssen.

Bits werden ab Position 0 (niedrigstwertiges Bit, LSB) gezählt. Wenn das Bit an der angegebenen Position bereits 0 ist, hat der Aufruf keinen sichtbaren Effekt.

Verwandte Funktionen sind gmp_setbit (setzt ein Bit auf 1) und gmp_testbit (prüft den Wert eines Bits).

Parameter

Name Typ Default Beschreibung
$num Pflicht GMP|int|string Die GMP-Zahl, deren Bit gelöscht werden soll. Wird als Referenz übergeben und direkt verändert. Kann ein GMP-Objekt, ein PHP-Integer oder eine numerische Zeichenkette sein.
$index Pflicht int Die 0-basierte Bit-Position, die auf 0 gesetzt werden soll. Muss nicht-negativ sein; ein negativer Wert führt zu einem ValueError.

Rückgabewert

Typ
void
Beschreibung
Die Funktion gibt keinen Wert zurück. Die Änderung erfolgt direkt an der übergebenen GMP-Zahl per Referenz.

Beispiele

Einzelnes Bit löschen und Ergebnis prüfen

<?php
// Zahl 0b1111 = 15
$num = gmp_init(15);
echo 'Vor clrbit:  ' . gmp_strval($num, 2) . PHP_EOL; // 1111

// Bit 2 (Wert 4) auf 0 setzen => 0b1011 = 11
gmp_clrbit($num, 2);
echo 'Nach clrbit: ' . gmp_strval($num, 2) . PHP_EOL; // 1011
echo 'Dezimalwert: ' . gmp_strval($num) . PHP_EOL;     // 11
Vor clrbit: 1111 Nach clrbit: 1011 Dezimalwert: 11

Berechtigungsmaske: Berechtigung entfernen

<?php
// Berechtigungen als Bitmaske (Bit 0 = Lesen, Bit 1 = Schreiben, Bit 2 = Ausführen)
$permissions = gmp_init(0b111); // alle Rechte gesetzt
echo 'Alle Rechte:     ' . gmp_strval($permissions, 2) . PHP_EOL;

// Schreibrecht (Bit 1) entfernen
gmp_clrbit($permissions, 1);
echo 'Ohne Schreiben:  ' . gmp_strval($permissions, 2) . PHP_EOL;

// Ausführrecht (Bit 2) entfernen
gmp_clrbit($permissions, 2);
echo 'Nur Lesen:       ' . gmp_strval($permissions, 2) . PHP_EOL;

// Nochmals Bit 1 löschen (bereits 0 — kein Effekt)
gmp_clrbit($permissions, 1);
echo 'Unverändert:     ' . gmp_strval($permissions, 2) . PHP_EOL;
Alle Rechte: 111 Ohne Schreiben: 101 Nur Lesen: 001 Unverändert: 001

// Wichtig · Fallstricke

Negativer Index: Seit PHP 8.0 wirft ein negativer Wert für index einen ValueError. In älteren PHP-Versionen konnte das Verhalten undefiniert sein.

Referenzübergabe: Da num per Referenz übergeben wird, verändert gmp_clrbit das Original-Objekt. Wer das ursprüngliche Objekt erhalten möchte, sollte vorher eine Kopie anlegen, z. B. mit gmp_init(gmp_strval($num)).

GMP-Erweiterung erforderlich: Die Funktion setzt voraus, dass PHP mit der GMP-Bibliothek kompiliert wurde (--with-gmp). Auf Systemen ohne GMP steht sie nicht zur Verfügung.