Re: Help with some clever bit operations

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




----- Original Message ----- From: "David Tulloh" <david@xxxxxxxxxxxx>
To: <zorglub_olsen@xxxxxxxxxxx>
Cc: <php-general@xxxxxxxxxxxxx>
Sent: Tuesday, June 13, 2006 12:18 PM
Subject: Re:  Help with some clever bit operations


The example starting values
$existing = 181; # = 10110101
$new = 92; # = 01011100
$mask = 15; # = 00001111

Get the bits that will be changed
$changing = $new & $mask; # = 12 = 00001100

Get the bits that won't be changed
$staying = $existing & ~$mask; # = 176 = 10110000

Combine them together
$result = $changing ^ $staying; # = 188 = 10111100


David


Though the result is the same, logically a bitwise OR (|) would be more appropriate. The bitwise XOR flips bits which, since in this case one set of them is always 0 produces the same result. The bitwise OR adds the bits.

An informal set of rules is:

&, as a filter, extracts those bits where you put ones in the mask
& sets to zero those bits where you put zero in the mask
| sets bits
^ flips the bits where you put a one.

$evenodd & 1 is true on odd numbers or otherwise tests for the rightmost bit. Coupled with a right shift >> allows you to loop through a set of bits.

for ($i=0;$i<32;$i++) {
   if ($bitset & 1) {
       echo "bit $i is set";
   }
   $bitset >>= 1;
}

Anyway, avoid the most significant bit. Since in PHP there are no unsigned integers, you might get some funny result if anything makes PHP do an automatic type conversion.

Satyam

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


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux