Start · Sprachen · PHP · Referenz · gmp_scan0

gmp_scan0

Funktion

Sucht ab einer bestimmten Bitposition nach dem ersten nicht gesetzten Bit (0-Bit) in einer GMP-Zahl.

seit PHP 4.0.4 Kategorie: math

Signatur

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

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

Typ
int
Beschreibung
Gibt den 0-basierten Index des ersten gefundenen 0-Bits zurück. Da jede endliche positive Zahl irgendwann führende Nullen hat, ist das Ergebnis immer eine nicht-negative ganze Zahl. Bei ungültigem $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;
Erstes 0-Bit ab Position 0: 3 Erstes 0-Bit ab Position 1: 3

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;
Erster freier Slot: 4 Nächster freier Slot: 5

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;
Erstes 0-Bit bei -1: (sehr großer Wert oder implementierungsabhängig) Erstes 0-Bit bei -2: 0

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