面试题之:颠倒二进制位的实现思路讲解(PHP通用版)
有几个知识 恶补下: (推荐学习:PHP视频教程)
1、一个数字占一个字节,也就是8位
打个比方 ,十进制数字 1 ,在计算机利用二进制表示 是 00000001 (如果十进制转二进制都忘了,请自行百度,这个忘了下面你看不懂~~~)
PHP中可以用
2、十进制数字相加 1+1 =2 (这个提示很重要哦~~,仔细体会)
用二进制 用位移来搞定
答: 00000010 这厮正好就是2 (2的1次方)
答:00000011 这厮正好就是3 (2的1次方+2的0次方=2+1=3)
答:00000100 这厮是4 (2的2次方)
答:00000101 这厮是4 (2的2次方+2的0次方=4+1=5)
开始解题
假设 有个二进制数 是 00000101 ,现在要把它倒过来,变成 10100000,请问怎么玩?
1、首先要有2个变量,
1)临时变量叫做 $xxoo , 初始值是0(十进制),二进制也就是00000000
2)原始值 变量,叫做$shit , 就是要做处理的 00000101
2、3个步骤
1) 把$xxoo 左移 一位
2) 判断 $shit的二进制值最后一位 是不是1,如果是 ,则给$xxoo的十进制值加1 ,这个很重要 看成二进制就是把00000000 变成 00000001,否则 $xxoo 初始值是00000000, 这个进行移位移个p啊。。。 都是零,那么怎么判断二进制最后一位是不是1? 你要通过截取字符串或正则判断(不是不可以哦)
答:只要把原值和 1(也就是00000001) 进行 逻辑与操作 (1&1 才是1 ,1&0 或0&1 一律是0)
3) 接下来把$shit 右移 1位
1)如原来是 00000101 ,移动后变成了 00000010 (也就是说$xxoo和shit同时移,一个左一个右,当shit最后一位是1的时候能被我们判断到,于是给$xxoo的末位也置为1,这样就能实现xxoo和shit既同步又相反)
上面的过程反复执行8 次,就能得到10100000
完整代码如下
function rev($n){ $xxoo = 0; for ($i = 0; $i < 8; $i++) { $xxoo = $xxoo << 1; if (($n & 1) == 1) { $xxoo++; } $n = $n >> 1; } return $xxoo;}echo decbin(rev(5));不过要注意的是,上面的函数支持1字节的数字(只支持8位)
网上的面试题是32位数字 ,接下来的代码是支持 通用位数的(这个代码网上没有哦~~~)。大家思考和理解一下,就不多解释了,需要有一些PHP代码功底:
function rev($n){ $num=intval(strlen(decbin($n))/8); //整除 8 if($num==0) $bitLen=8;//最小8位 else { if((strlen(decbin($n)) % 8)>0) $bitLen=($num+1)*8; else $bitLen=$num*8; } echo “原始值二进制:”.str_pad(decbin($n),$bitLen,’0′,STR_PAD_LEFT).”<br/>”; $xxoo = 0; for ($i = 0; $i < $bitLen; $i++) { $xxoo = $xxoo << 1; if (($n & 1) == 1) { $xxoo++; } $n = $n >> 1; } echo “反转后值二进制:”.str_pad(decbin($xxoo),$bitLen,’0′,STR_PAD_LEFT).”<br/>”; return $xxoo;}调用测试
echo rev(4);echo rev(43261596);
结果
原始值二进制:00000100反转后值二进制:0010000032原始值二进制:00000010100101000001111010011100反转后值二进制:00111001011110000010100101000000964176192
以上就是面试题之:颠倒二进制位的实现思路讲解(PHP通用版)的详细内容,更多内容请关注技术你好其它相关文章!
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场