Jochem Maas wrote:
Mathijs wrote:
Jochem Maas wrote:
Mathijs wrote:
...
Thank you very much.
This seems to work :).
cool. heres's a couple of funcs that might help you to understand bitwise
operations better:
<?php
/* whether there is only 1 single bit set or not */
function single_bit_set(/*int*/ $i)
{
// beware: if $i is zero !($i & ~get_ls1bit($i)) returns true;
return $i ? !($i & ~get_ls1bit($i)): false;
}
/* return the value of the least significant bit */
function get_ls1bit(/*int*/ $i)
{
for ($j = 1; $i && !($i & $j); $j <<= 1);
return $i ? $j : 0;
}
/* return the value of the most significant bit */
function get_ms1bit(/*int*/ $i)
{
$x = 0;
for ($j = $i; $i && !($j == 1); $j >>= 1) { $x++; }
return $i ? $j <<= $x: 0;
}
/* doesn't break when exponents are near the wordsize
* of the machine as the native xor does, here is some example code to
* illustrate:
php -r '
// include function definition here
$x = 3851235679;
$y = 43814;
echo "\nThis is the value we want";
echo "\n3851262585";
echo "\nThe result of a native xor operation on integer values is treated as a signed integer";
echo "\n".($x ^ $y);
echo "\nWe therefore perform the MSB separately";
echo "\n".get_xor32($x, $y)."\n";
'
*/
function get_xor32(/*int*/ $a, /*int*/ $b)
{
$a1 = $a & 0x7FFF0000;
$a2 = $a & 0x0000FFFF;
$a3 = $a & 0x80000000;
$b1 = $b & 0x7FFF0000;
$b2 = $b & 0x0000FFFF;
$b3 = $b & 0x80000000;
$c = ($a3 != $b3) ? 0x80000000 : 0;
return (($a1 ^ $b1) |($a2 ^ $b2)) + $c;
}
function get_bit_str($var, $safety = 0)
{
$rtn = '';
$var = intval($var);
if ($var < 0) { $var = 0 - $var; }
while ($var != 0 /*&& $safety < 31*/) {
$rtn .= ($var & 1);
$var >>= 1;
$safety++;
}
return $rtn;
}
Thx alot :).
It will sure help me understanding it better :).
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php