Start · Sprachen · PHP · Referenz · gmp_and

gmp_and

Funktion

Berechnet das bitweise UND (<code>&amp;</code>) zweier beliebig großer Ganzzahlen (GMP-Zahlen) und gibt das Ergebnis als GMP-Objekt zurück.

seit PHP 4.0.4 Kategorie: math

Signatur

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

Beschreibung

gmp_and() führt eine bitweise UND-Verknüpfung zwischen zwei Ganzzahlen durch. Bei der UND-Operation ist jedes Bit im Ergebnis genau dann 1, wenn das entsprechende Bit in beiden Operanden 1 ist – andernfalls ist es 0. Die Funktion arbeitet intern mit der GMP-Bibliothek (GNU Multiple Precision) und unterstützt damit Zahlen beliebiger Größe, die weit über den Bereich normaler PHP-Integer (int) hinausgehen.

Die Parameter können als GMP-Objekt, als native PHP-Ganzzahl oder als Zeichenkette (dezimale oder hexadezimale Darstellung) übergeben werden. Das Ergebnis ist immer ein GMP-Objekt, das mit anderen GMP-Funktionen weiterverarbeitet oder mit gmp_intval() bzw. gmp_strval() in einen primitiven Typ umgewandelt werden kann.

Typische Anwendungsfälle sind Bitmaskierung (z. B. Rechte- oder Flag-Prüfungen), Subnetz-Berechnungen mit großen IP-Adressbereichen sowie kryptographische und zahlentheoretische Algorithmen, bei denen Präzisionsverluste durch normale PHP-Ganzzahlen nicht akzeptabel sind.

Negative Zahlen werden in der GMP-Bibliothek als Zweierkomplement mit unendlich vielen führenden Einsen behandelt, was bei der bitweisen UND-Verknüpfung negativer Operanden zu beachten ist.

Parameter

Name Typ Default Beschreibung
$num1 Pflicht GMP|int|string Erster Operand. Kann ein GMP-Objekt, eine native PHP-Ganzzahl oder eine Zeichenkette mit dezimaler bzw. hexadezimaler Zahl sein.
$num2 Pflicht GMP|int|string Zweiter Operand. Gleiche Typen wie num1 werden akzeptiert.

Rückgabewert

Typ
GMP
Beschreibung
Gibt ein GMP-Objekt zurück, das das Ergebnis der bitweisen UND-Verknüpfung der beiden Operanden enthält. Das Ergebnis kann mit gmp_intval() oder gmp_strval() in einen primitiven Typ konvertiert werden.

Beispiele

Einfache bitweise UND-Verknüpfung zweier Ganzzahlen

<?php
// 12 = 1100 (binär)
// 10 = 1010 (binär)
// 12 & 10 = 1000 = 8

$result = gmp_and(12, 10);
echo gmp_intval($result); // 8

// Zur Verdeutlichung:
echo PHP_EOL;
echo decbin(12) . PHP_EOL; // 1100
echo decbin(10) . PHP_EOL; // 1010
echo decbin(gmp_intval($result)); // 1000
8 1100 1010 1000

Bitmaskierung: Berechtigungen mit einer Maske prüfen

<?php
// Berechtigungen als Bitmaske
const PERM_READ    = 0b001; // 1
const PERM_WRITE   = 0b010; // 2
const PERM_EXECUTE = 0b100; // 4

// Benutzer hat Lese- und Schreibrechte
$userPerms = gmp_init(PERM_READ | PERM_WRITE); // 3 = 0b011

// Prüfen, ob der Benutzer Schreibrecht hat
$mask = gmp_init(PERM_WRITE);
$hasWrite = gmp_and($userPerms, $mask);

if (gmp_intval($hasWrite) !== 0) {
    echo 'Schreibrecht vorhanden.' . PHP_EOL;
} else {
    echo 'Kein Schreibrecht.' . PHP_EOL;
}

// Prüfen, ob der Benutzer Ausführrecht hat
$maskExec = gmp_init(PERM_EXECUTE);
$hasExec = gmp_and($userPerms, $maskExec);

if (gmp_intval($hasExec) !== 0) {
    echo 'Ausführrecht vorhanden.' . PHP_EOL;
} else {
    echo 'Kein Ausführrecht.' . PHP_EOL;
}
Schreibrecht vorhanden. Kein Ausführrecht.

Bitweise UND mit sehr großen Zahlen

<?php
// Zahlen, die den PHP-int-Bereich überschreiten würden
$a = gmp_init('123456789012345678901234567890');
$b = gmp_init('987654321098765432109876543210');

$result = gmp_and($a, $b);
echo gmp_strval($result);
121645100408832000006220693642

// Wichtig · Fallstricke

Negative Zahlen: GMP behandelt negative Zahlen intern als Zweierkomplement mit unendlich vielen führenden Einsen. Das Ergebnis von gmp_and() mit negativen Operanden kann daher unerwartet wirken, wenn man mit endlichen Bitbreiten rechnet. Testen Sie solche Fälle sorgfältig.

Voraussetzung: Die GMP-Erweiterung muss beim PHP-Build eingebunden worden sein (Konfigurationsoption --with-gmp). Auf vielen Systemen ist sie standardmäßig verfügbar; falls nicht, muss das Paket (z. B. php-gmp) installiert werden.

Typen ab PHP 8.0: Seit PHP 8.0 liefert gmp_init() und damit alle GMP-Funktionen echte GMP-Objekte statt Ressourcen. Älterer Code, der auf Ressource-Checks setzt, muss ggf. angepasst werden.