Start · Sprachen · PHP · Referenz · gmp_scan1

gmp_scan1

Funktion

Sucht im GMP-Integer <code>num</code> ab der Bitposition <code>start</code> nach dem ersten gesetzten Bit (1-Bit) und gibt dessen Position zurück.

seit PHP 4.0.4 Kategorie: math

Signatur

gmp_scan1(GMP|int|string $num, int $start): int

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

Typ
int
Beschreibung
Gibt die Position (nullbasierter Index) des ersten gefundenen 1-Bits zurück. Bei einer nicht-negativen Zahl ohne weiteres gesetztes 1-Bit wird -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;
Erstes 1-Bit ab Position 0: 2 Erstes 1-Bit ab Position 3: 3

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;
Gesetzte Bits in 42: 1, 3, 5

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;
Erstes 1-Bit in -1 ab Position 0: 0 Erstes 1-Bit in -4 ab Position 0: 2

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