//PHP
//32位还是64位 谨防溢出
function revse32int($a,$len)//len是要旋转的数字位数,从右侧起
{
//$a = 0x18b 0b110001011 $len = 9
$tmp=$i=$j=0;
for($i=0,$j=$len-1;$i<$len;++$i,--$j)
{
if(($a>>$i)&1) //不为0
$tmp|=(($a>>$i)&1)<<$j;//$tmp 0b000000000 | 0b110001011 >> $i << $j
/***
步骤分析:
第一次:
110001011 >> 0 == 110001011
110001011 & 000000001 = 000000001 //确保只保存当前反转的位的值
000000001 << 8 == 100000000
000000000 | 100000000 == 100000000
第二次
110001011 >> 1 == 011000101
011000101 & 000000001 = 000000001
000000001 << 7 == 010000000
100000000 | 010000000 == 110000000
第三次
110001011 >> 2 == 001100010
001100010 & 000000001 = 000000000
000000000 << 6 == 000000000
110000000 | 000000000 == 110000000
...
第8次
110001011 >> 7 == 000000011
000000011 & 000000001 = 000000001
000000001 << 1 == 000000010
110100000 | 000000010 = 110100010
第9次
110001011 >> 8 == 000000001
000000011 & 000000001 = 000000001
000000001 << 0 == 000000001
110100010 | 000000001 = 110100011
结论
反转 不断把倒数n位 放置到 顺数n位
**/
}
return $tmp;
}
$a=0x18b;//0b110001011 9位
/**echo hexdec((int)$a);
$b = (string)decbin(hexdec($a));
echo $b;**/
printf("%x\n",revse32int($a,9));
var_dump(revse32int(0x8b,8));