I am trying to use bitwise operators to work out the broadcast address using PHP. I am facing an issue when using the ~ (NOT) operator to invert the subnet mask as it returns in string format.
// Derive from inputs normally
$ipv4 = '130.45.34.36';
$subnet_mask = '255.255.240.0';
$network = (object) [
'ipv4' => explode('.', $ipv4),
'subnet_mask' => explode('.', $subnet_mask)
];
$broadcast = [];
$net_address = [];
for($i = 0; $i <= count($network->ipv4) -1; $i++)
$broadcast[$i] = ($net_address[] = (float) $network->ipv4[$i] & (float) $network->subnet_mask[$i])
| ((int) ~$network->subnet_mask[$i]) +256;
printf("Network Address: %s\n", implode('.', $net_address)); // 130.45.32.0 (Expected)
printf("Broadcast Address: %s", implode('.', $broadcast)); // 386.301.288.256 (Unexpected)
Since ~$network->subnet_mask[$i] returns a string, I've tired to cast it first to an (int) which has caused the unexpected result - without this cast, I get a string + int conversion error. I assume I need a different datatype, any help appreciated. My expected Broadcast Address is: 130.45.47.255.
EDIT #1: I have tried to use (float) casts, which resulted in the same output.