function circular_shift($what,$direction='<<',$steps=1,$wordlength=32)
{
$bits = base_convert((string)(int)$what,10,2);
for ($i=0; $i < $steps; $i++)
{
$length = strlen($bits);
if ('<<'==$direction)
{
if ( $length == $wordlength && '1' == $bits[0] )
// overflow
$bits = substr($bits,1).'1';
else
$bits = $bits.'0';
}
elseif ('>>'==$direction)
{
if ( $length < $wordlength )
// shortage
$bits = $bits.'0';
else
$bits = $bits[$length-1].substr($bits,0,$length-1);
}
else
die('WTF?!');
}
return (int)base_convert($bits,2,10);
}
print circular_shift(8) ;
зы: Другие типы сдвигов делаются аналогично. Развивая тему, можно даже связать сдвиги с колбеками и завернуть в класс.
Успехов