按位反转

//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));

 

posted on 2016-11-18 14:37  小乔流水人家  阅读(194)  评论(0编辑  收藏  举报

导航