# Problems using bitwise &

#### Do you have a question? Post it now! No Registration Necessary.  Now with pictures!

•  Subject
• Author
• Posted on

I'm trying to perform some basic mathematics on IP Addresses. IP's are
normally represented as 32 bit unsigned integers. However I am getting
strange results when using the operators in PHP.

If you run this is a mysql query browser:    select (3388826209 &
4294867288) as val; it will tell you the correct answer is:
3388760128. This is the answer I want. My snippet of PHP code is here:

//make php treats these likes numbers and not strings

\$ip += (int)0;
\$subnet += (int)0;

if (\$ip == 0)
return "NOT SET";

\$ans = \$ip & \$subnet; //Bitwise AND.

print("<!-- sip  F (ip=\$ip,subnet=\$subnet) returned is
\$ans -->\n");
return (\$ans);

However my output is like this:

<!-- sip  F (ip=170419457,subnet=4294967040) returned is 170419456 -->
<!-- sip  F (ip=170419457,subnet=4294967040) returned is 170419456 -->
<!-- sip  F (ip=3388826225,subnet=4294967280) returned is -906141072 --

<!-- sip  F (ip=3388826225,subnet=4294967280) returned is -906141072 --

<!-- sip  F (ip=170419969,subnet=4294967040) returned is 170419968 -->

<!-- sip  F (ip=170419969,subnet=4294967040) returned is 170419968 -->

Where the IP starts 17... the answer is correct. When the value starts
3388 the value is wrong.

I guess this is because PHP is treating the number as a 64 bit one
rather than an unsigned 32 bit one but I'm not really sure. Can anyone

## Re: Problems using bitwise &

wrote:

My current very-hacky workaround is to do this:

\$res = mysql_query("SELECT \$ip & \$subnet;");

...

but as you can see it's bordering on "very wrong"!

## Re: Problems using bitwise &

Philluminati wrote: