Signatur
Beschreibung
gmp_or führt eine bitweise ODER-Operation auf zwei Ganzzahlen beliebiger Größe durch. Dabei wird jedes Bit des Ergebnisses auf 1 gesetzt, wenn mindestens eines der entsprechenden Bits in den Operanden 1 ist. Die Funktion gehört zur GNU Multiple Precision Arithmetic Library (GMP) und erlaubt die Arbeit mit Zahlen, die über die Grenzen nativer PHP-Integer hinausgehen.
Die Parameter können als GMP-Objekte, native PHP-Integer oder als numerische Zeichenketten übergeben werden. Dies macht die Funktion flexibel einsetzbar, ohne dass eine explizite Konvertierung notwendig ist. Das Ergebnis ist immer ein GMP-Objekt, das mit anderen GMP-Funktionen weiterverarbeitet oder mit gmp_strval() in eine Zeichenkette umgewandelt werden kann.
Typische Anwendungsfälle sind die Verarbeitung von Bitmasken in kryptografischen Algorithmen, das Setzen bestimmter Flags in großen Binärzahlen oder allgemein überall dort, wo bitweise Operationen auf sehr großen Zahlen notwendig sind, die nicht als reguläre PHP-Integer darstellbar wären.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $num1 Pflicht | GMP|int|string | Erster Operand der bitweisen ODER-Operation. Kann ein GMP-Objekt, ein PHP-Integer oder eine numerische Zeichenkette sein. |
|
| $num2 Pflicht | GMP|int|string | Zweiter Operand der bitweisen ODER-Operation. Kann ein GMP-Objekt, ein PHP-Integer oder eine numerische Zeichenkette sein. |
Rückgabewert
GMP-Objekt zurück, das das Ergebnis der bitweisen ODER-Operation der beiden Operanden enthält. Das Ergebnis kann mit gmp_strval(), gmp_intval() oder direkt in Ausdrücken mit anderen GMP-Funktionen verwendet werden.Beispiele
Einfaches bitweises ODER zweier Ganzzahlen
<?php
// 0b1010 (10) OR 0b0110 (6) = 0b1110 (14)
$a = gmp_init(10); // binär: 1010
$b = gmp_init(6); // binär: 0110
$result = gmp_or($a, $b);
echo gmp_strval($result) . PHP_EOL; // Ergebnis: 14 (binär: 1110)
echo decbin(gmp_intval($result)); // Ausgabe: 1110
Bitmaske auf eine sehr große Zahl anwenden
<?php
// Setze bestimmte Bits in einer sehr großen Zahl per OR-Maske
$bigNumber = gmp_init('123456789012345678901234567890');
$mask = gmp_init('111111111111111111111111111111'); // Maske als Dezimalzahl
$result = gmp_or($bigNumber, $mask);
echo gmp_strval($result) . PHP_EOL;
// Vereinfachtes Beispiel: Flags setzen
define('FLAG_READ', 0b0001);
define('FLAG_WRITE', 0b0010);
define('FLAG_EXECUTE', 0b0100);
$permissions = gmp_init(0);
// READ und WRITE-Recht setzen
$permissions = gmp_or($permissions, FLAG_READ);
$permissions = gmp_or($permissions, FLAG_WRITE);
echo 'Rechte (binär): ' . decbin(gmp_intval($permissions)) . PHP_EOL; // 11
echo 'Rechte (dez): ' . gmp_strval($permissions) . PHP_EOL; // 3
// Wichtig · Fallstricke
Die GMP-Erweiterung muss in PHP aktiviert sein (Kompilierung mit --with-gmp oder entsprechende Shared-Extension). Ist sie nicht verfügbar, wirft PHP einen fatalen Fehler.
Bei negativen Zahlen verwendet GMP intern eine Zweierkomplement-Darstellung mit unbegrenzter Präzision, was das Verhalten von gmp_or bei negativen Operanden von den entsprechenden nativen PHP-Bitoperationen unterscheiden kann. Für rein nicht-negative Zahlen ist das Verhalten identisch zu | in PHP.
Ab PHP 5.6 können GMP-Objekte direkt in arithmetischen Ausdrücken verwendet werden, jedoch nicht mit nativen Bitoperatoren wie | – dafür ist immer gmp_or() nötig.