How can I calculate my Broadcast Address in PHP?

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.

Answer

Solution:

Use the conversion functions to perform bitwise operations on long integers and then convert back to IP and you don't need all the exploding, looping etc.

Swap the bits that are set/not set in the subnet mask with ~ NOT to get the wildcard mask and then | OR that with the IP address:

$broadcast = long2ip(ip2long($ipv4) | ~ip2long($subnet_mask));

For the network just & AND the IP address and subnet mask:

$network = long2ip(ip2long($ipv4) & ip2long($subnet_mask));

Source