Signatur
Beschreibung
gmp_scan1 durchsucht die Binärdarstellung einer GMP-Zahl ab einer angegebenen Startposition nach dem ersten Bit, das auf 1 gesetzt ist, und liefert den Index dieses Bits. Die Bitpositionen werden bei 0 (Least Significant Bit) beginnend gezählt.
Diese Funktion ist nützlich, wenn man bestimmte Bit-Muster in sehr großen Ganzzahlen analysieren möchte, beispielsweise beim Arbeiten mit kryptografischen Algorithmen, Primzahlberechnungen oder effizienten Flaggen-/Maskenoperationen auf beliebig großen Zahlen.
Ist num negativ, wird die Zahl intern im Zweierkomplement-Format interpretiert, was bei der Positionsberechnung berücksichtigt werden muss. Gibt es ab start kein gesetztes 1-Bit mehr (was bei nicht-negativen Zahlen vorkommen kann, wenn alle höherwertigen Bits 0 sind), so gibt gmp_scan1 bei negativen Zahlen immer einen Wert zurück, da unendlich viele 1-Bits im Zweierkomplement folgen.
Im Unterschied dazu sucht gmp_scan0 nach dem ersten 0-Bit. Beide Funktionen eignen sich hervorragend zur bitweisen Analyse großer Zahlen, für die PHP-interne Integer nicht ausreichen würden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $num Pflicht | GMP|int|string | Die zu durchsuchende Zahl als GMP-Objekt, Integer oder numerischer String. | |
| $start Pflicht | int | Die Bitposition (nullbasiert), ab der die Suche beginnt. Muss >= 0 sein. |
Rückgabewert
-1 zurückgegeben. Bei negativen Zahlen wird immer eine gültige Position zurückgegeben, da im Zweierkomplement unendlich viele 1-Bits folgen.Beispiele
Einfache Suche nach dem ersten 1-Bit
<?php
// 12 in binär: 1100
// Bit 0 = 0, Bit 1 = 0, Bit 2 = 1 (erstes gesetztes Bit)
$zahl = gmp_init(12);
$position = gmp_scan1($zahl, 0);
echo "Erstes 1-Bit ab Position 0: " . $position . PHP_EOL;
// Suche ab Position 3
$position2 = gmp_scan1($zahl, 3);
echo "Erstes 1-Bit ab Position 3: " . $position2 . PHP_EOL;
Alle gesetzten Bits einer GMP-Zahl aufzählen
<?php
// 42 in binär: 101010
// Gesetzte Bits: Position 1, 3, 5
$zahl = gmp_init(42);
$pos = 0;
$bits = [];
while (($pos = gmp_scan1($zahl, $pos)) !== -1) {
$bits[] = $pos;
$pos++; // nächste Position für weiteren Scan
}
echo "Gesetzte Bits in 42: " . implode(', ', $bits) . PHP_EOL;
Verhalten mit negativer Zahl
<?php
// -1 in Zweierkomplement: alle Bits gesetzt
$zahl = gmp_init(-1);
$position = gmp_scan1($zahl, 0);
echo "Erstes 1-Bit in -1 ab Position 0: " . $position . PHP_EOL;
// -4 in Zweierkomplement: ...11111100
// Erstes 1-Bit ist an Position 2
$zahl2 = gmp_init(-4);
$position2 = gmp_scan1($zahl2, 0);
echo "Erstes 1-Bit in -4 ab Position 0: " . $position2 . PHP_EOL;
// Wichtig · Fallstricke
Achtung bei der Rückgabe -1: Der Wert -1 wird nur bei nicht-negativen Zahlen zurückgegeben, wenn kein weiteres 1-Bit gefunden wird. Bei negativen GMP-Zahlen wird stets eine gültige Position zurückgeliefert (Zweierkomplement mit unendlich vielen führenden 1-Bits). Prüfe daher den Rückgabewert immer mit striktem Vergleich (=== -1), um Endlosschleifen zu vermeiden.
Der Parameter start muss nicht-negativ sein. Ein negativer start-Wert führt zu einem Fehler. Die GMP-Erweiterung muss in der PHP-Installation aktiviert sein (--with-gmp).