bitwize '&' operator trouble

From: Date: Mon, 04 Oct 2004 16:35:00 +0000
Subject: bitwize '&' operator trouble
Groups: php.general 
Request: Send a blank email to php-general+get-198598@lists.php.net to get a copy of this message
I ran across this problem with php 5.0.2 in Linux. This problem did not exist before and this code was used in php 5.0.0, 5.0.1, 5.0.2-dev, and several other cvs snaps along the way -all on Linux. <?php // example // network IP and mask $range = '192.168.0.0/24'; list($ip,$mask) = explode('/', $range); // Calculate the number of hosts. $numHosts = pow(2, (32 - $mask)); print "num hosts: $numHosts<br>\n"; // Netmask = fullmask - number of hosts. $netmask = pow(2, 32) - $numHosts; print "netmask: $netmask<br>\n"; print "human readable netmask: " . long2ip($netmask) . "<br>\n"; // address to number $ipLong = ip2long($ip); print "ip2long ip: $ipLong<br>\n"; // here is where the problem is: print "(\$ipLong & \$netmask): ".($ipLong & $netmask)."<br>\n"; // PHP 5.0.2-dev (cli) (built: Sep 21 2004 14:39:26) // prints out "-1062731776" //PHP 5.0.2 (cli) (built: Sep 24 2004 13:58:57) // prints out "1084751872" // ...and so the following always fails: // If the ip is not equal to (itself & netmask) it cannot be on the network boundary if ($ipLong != ($ipLong & $netmask)) echo "Ip NOT on network boundary!"; else echo "Ip IS on network boundary!"; ?> I'm sure there are other ways to test if an ip is on a the network boundary of a given CIDR and I'll appreciate any examples of that. However, I am more interested in why and'ing these two numbers returns a different value now. I'm unable to find any clues in the docs. Thanks, Jim Grill

« previous php.general (#198598) next »