Das Zweierkomplementformat der Integers macht die Sache für Dich sogar einfacher. Sei "L" die Präfixlänge.
L Subnetzmaske Int-Wert Rechnung
32 FFFFFFFF -1 -pow(2,0)
31 FFFFFFFE -2 -pow(2,1)
30 FFFFFFFC -4 -pow(2,2)
29 FFFFFFF8 -8 -pow(2,3)
28 FFFFFFF0 -16 -pow(2,4)
...
2 C0000000 -1073741824 -pow(2,30)
1 80000000 -2147483648 -pow(2,31)
Zu beachten bei POW ist nur, dass das eine Float-Funktion ist und keine Integer-Funktion. Das hat aber den Vorteil, dass Du pow(2,31) berechnen kannst, ohne darüber nachdenken zu müssen ob dein PHP durch einen 32-bit oder 64-bit Compiler auf die Welt gekommen ist (weil $$+2^{31}$$ kein gültiger 32-bit integer ist, $$-(2^{31})$$ dagegen schon). Und weil die Bit-Operatoren von PHP ihre Operanden automatisch nach integer konvertieren, kannst Du damit einfach loslegen. Und selbst wenn PHP die pow-Funktion nach der Taschenrechner-Methode umsetzt ($$a^b = e^{b\cdot \ln a}$$), sollte es hinreichend genau sein, um nach INT-Konvertierung die Zweierpotenzen richtig zu treffen, weil die PHP floats laut Handbuch immer 64-bittig sind (also eigentlich double).
Also: Subnetzmaske = -pow(2, 32-l) und gut ist.
Ich kann hier nur nicht ausprobieren ob es eine versteckte Tücke dabei gibt, kein PHP zur Hand...
Rolf