//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 ",revse32int($a,9)); var_dump(revse32int(0x8b,8));