On 20 August 2010 17:10, Andy McKenzie <amckenz...@gmail.com> wrote:
> Hey everyone,
>
>  I'm really not sure what's going on here:  basically, the bitwise
> NOT operator seems to simply not work.  Here's an example of what I
> see.
>
> ============Script============
>
> $ cat bintest2.php
>
> <?php
>
> $bin = 2;
> $notbin = ~$bin;
>
> echo "Bin: " . decbin($bin) . "  !bin:  " . decbin($notbin) . "\n";
> echo "Bin: $bin  !bin:  $notbin\n";
>
>
> ?>
> =============================
>
>
> ============Output============
>
> $ php bintest2.php
> Bin: 10  !bin:  11111111111111111111111111111101
> Bin: 2  !bin:  -3
>
> =============================
>
>
> Obviously that's not the expected response.  I expect to get something
> more like this:
>
> Bin: 10  !bin:  01
> Bin: 2  !bin:  1
>
>
> Can anyone shed some light on this for me?  The server is running an
> old version of OpenSUSE, and php --version returns:
>

You probably need to read up on computer architechture and CS theory -
the ~ operator works fine, your understanding does not. What you're
looking at is the following:

$bin = 2 = 00000000000000000000000000000010 (64 bit number)
~$bin = ~2 = -3 = 11111111111111111111111111111101 (the inverse of the above)

Computers generally do not operate on a couple of bits from a byte -
they tend to operate on a byte, a word, a doubleword, etc (before any
nitpickers interrupt: sure, they can, but most operations don't).
Hence, you're not doing a not operation on just "10", you're doing it
on "00000000000000000000000000000010". And as you are operating on a
signed int, you'll get a negative number out of the ~ operation
(seeing as you flipped the most significant bit).

Regards
Peter

-- 
<hype>
WWW: http://plphp.dk / http://plind.dk
LinkedIn: http://www.linkedin.com/in/plind
BeWelcome/Couchsurfing: Fake51
Twitter: http://twitter.com/kafe15
</hype>

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to