'Twas brillig, and Andy McKenzie at 20/08/10 16:10 did gyre and gimble:
> 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 output looks correct to me, so I think it's your expectations that
are incorrect.

You are assuming that you are working with a 2-bit number the in actual
fact you are working with a 32-bit number.

If you did

$bin = 2;
$notbin = ~$bin & 3;

Then this should get the results you want. The bitwise & 3 bit
essentially limits things to a 2-bit number. (3 in binary is represented
by 1's for the two LSBs and 0's for all other bits).

FWIW, the fact that ~2 == -3 is due to twos compliment binary notation:
http://en.wikipedia.org/wiki/Twos_Compliment

Col

-- 

Colin Guthrie
gmane(at)colin.guthr.ie
http://colin.guthr.ie/

Day Job:
  Tribalogic Limited [http://www.tribalogic.net/]
Open Source:
  Mandriva Linux Contributor [http://www.mandriva.com/]
  PulseAudio Hacker [http://www.pulseaudio.org/]
  Trac Hacker [http://trac.edgewall.org/]


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

Reply via email to