Signatur
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
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
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;
}
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);
// 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.