Signatur
Beschreibung
gmp_scan0 durchsucht die binäre Darstellung der GMP-Zahl $num beginnend ab der Bitposition $start nach dem ersten Bit, das den Wert 0 hat. Zurückgegeben wird der Index (0-basiert) dieses Bits.
Die Funktion ist nützlich, wenn man in großen Ganzzahlen gezielt nach freien Bit-Positionen sucht, beispielsweise bei Implementierungen von Bitmaps, Berechtigungsmasken oder kryptografischen Algorithmen, die auf Bitmanipulation basieren.
Negative GMP-Zahlen werden in der Zweierkomplementdarstellung (two's complement) interpretiert, was dazu führt, dass sehr hohe oder negative Zahlen ein unerwartetes Suchergebnis liefern können. Bei negativen Zahlen existieren unendlich viele führende 1-Bits, sodass das erste 0-Bit immer irgendwo in den niederwertigen Bits liegt.
Die Bitindizierung beginnt bei 0 (niederwertigstes Bit). Der Parameter $start muss größer oder gleich 0 sein, sonst wird eine Warnung ausgegeben und -1 zurückgegeben.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $num Pflicht | GMP|int|string | Die zu durchsuchende Ganzzahl als GMP-Objekt, PHP-int oder numerischer string. |
|
| $start Pflicht | int | Die Startposition (0-basiert) der Suche. Muss >= 0 sein. Die Suche beginnt ab diesem Bit und geht in Richtung höherwertiger Bits. |
Rückgabewert
$start (kleiner 0) wird -1 zurückgegeben.Beispiele
Erstes 0-Bit in einer einfachen Zahl finden
<?php
// Dezimal 7 = Binär 0...0111
// Bits 0, 1, 2 sind gesetzt (1); Bit 3 ist das erste 0-Bit
$num = gmp_init(7);
$pos = gmp_scan0($num, 0);
echo "Erstes 0-Bit ab Position 0: " . $pos . PHP_EOL;
// Suche ab Position 1 (Bit 0 überspringen)
$pos2 = gmp_scan0($num, 1);
echo "Erstes 0-Bit ab Position 1: " . $pos2 . PHP_EOL;
Bitmap – nächsten freien Slot finden
<?php
// Simulation einer Bitmap: die ersten 4 Slots (Bits 0–3) sind belegt
// Dezimal 15 = Binär 1111
$bitmap = gmp_init(15);
// Suche ab Bit 0 nach dem ersten freien Slot (0-Bit)
$freierSlot = gmp_scan0($bitmap, 0);
echo "Erster freier Slot: " . $freierSlot . PHP_EOL;
// Slot belegen und erneut suchen
$bitmap = gmp_setbit($bitmap, $freierSlot);
$naechsterFreierSlot = gmp_scan0($bitmap, 0);
echo "Nächster freier Slot: " . $naechsterFreierSlot . PHP_EOL;
Verhalten bei negativen Zahlen
<?php
// -1 in Zweierkomplement = alle Bits sind 1 (unendlich viele)
// Es gibt kein 0-Bit in den positiven Positionen für -1
// Daher wird eine sehr hohe Zahl zurückgegeben (implementierungsabhängig)
$neg = gmp_init(-1);
$pos = gmp_scan0($neg, 0);
echo "Erstes 0-Bit bei -1: " . $pos . PHP_EOL;
// -2 = Binär ...11111110 → Bit 0 ist 0
$neg2 = gmp_init(-2);
$pos2 = gmp_scan0($neg2, 0);
echo "Erstes 0-Bit bei -2: " . $pos2 . PHP_EOL;
// Wichtig · Fallstricke
Negative Zahlen: Bei negativen GMP-Werten wird die Zweierkomplementdarstellung verwendet. Da negative Zahlen konzeptuell unendlich viele führende 1-Bits besitzen, kann gmp_scan0 bei manchen negativen Werten (z. B. -1) einen sehr großen oder unerwarteten Rückgabewert liefern. Im Praxiseinsatz sollte man daher bevorzugt mit nicht-negativen Zahlen arbeiten.
Ungültiger Startindex: Wird $start mit einem Wert kleiner als 0 übergeben, erzeugt PHP eine Warnung und die Funktion gibt -1 zurück.
GMP-Erweiterung erforderlich: Die Funktion setzt die gmp-Erweiterung voraus, die ab PHP 5.2 standardmäßig mitgeliefert wird, aber ggf. manuell aktiviert werden muss (extension=gmp in der php.ini).