Start · Sprachen · PHP · Referenz · gmp_or

gmp_or

Funktion

Berechnet das bitweise ODER zweier großer Ganzzahlen (GMP-Objekte oder Integer) und gibt das Ergebnis als <code>GMP</code>-Objekt zurück.

seit PHP 4.0.4 Kategorie: math

Signatur

gmp_or(GMP|int|string $num1, GMP|int|string $num2): GMP

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

Typ
GMP
Beschreibung
Gibt ein 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
14 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
123456789012345678901234567890 Rechte (binär): 11 Rechte (dez): 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.