• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

面试题之:颠倒二进制位的实现思路讲解(PHP通用版)

php 搞代码 3年前 (2022-01-21) 25次浏览 已收录 0个评论

这是一个面试题,有学员表示不能理解。 简单给大家培训下,并不是很难,但是要写完善比较考验基础功底,也需要有些逻辑思维能力,由于学员的方向是PHP,那么就用PHP来讲解下,同时也是告诉大家 学PHP并不是说只要会写两句 echo “hello world”,或者循环输出到网页就叫会PHP了。

有几个知识 恶补下: (推荐学习:PHP视频教程)

1、一个数字占一个字节,也就是8位

打个比方 ,十进制数字 1 ,在计算机利用二进制表示 是 00000001 (如果十进制转二进制都忘了,请自行百度,这个忘了下面你看不懂~~~)

PHP中可以用

echo bindec("00000001");   //bindec函数可以让你体会到 二进制和10进制之间的 骚转换<b>6本文来源gao@dai!ma.com搞$代^码!网7</b><pre>搞gaodaima代码

2、十进制数字相加 1+1 =2 (这个提示很重要哦~~,仔细体会)

用二进制 用位移来搞定

: 00000010 这厮正好就是2 (2的1次方)

那么十进制 2+1=3 呢?

:00000011 这厮正好就是3 (2的1次方+2的0次方=2+1=3)

那么十进制 3+1=4 呢?

:00000100 这厮是4 (2的2次方)

那么十进制 4+1=5 呢?

: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)<br />{<br />    $xxoo = 0;<br />    for ($i = 0; $i < 8; $i++) {<br />        $xxoo = $xxoo << 1;<br />        if (($n & 1) == 1) {<br />            $xxoo++;<br />        }<br />        $n = $n >> 1;<br />    }<br />    return $xxoo;<br />}<br />echo decbin(rev(5));<br />

不过要注意的是,上面的函数支持1字节的数字(只支持8位)

网上的面试题是32位数字 ,接下来的代码是支持 通用位数的(这个代码网上没有哦~~~)。大家思考和理解一下,就不多解释了,需要有一些PHP代码功底:

function rev($n)<br />{<br />    $num=intval(strlen(decbin($n))/8); //整除 8<br />    if($num==0)<br />        $bitLen=8;//最小8位<br />    else<br />    {<br />        if((strlen(decbin($n)) % 8)>0)<br />            $bitLen=($num+1)*8;<br />        else<br />            $bitLen=$num*8;<br />    }<br />    echo “原始值二进制:”.str_pad(decbin($n),$bitLen,’0′,STR_PAD_LEFT).”<br/>”;<br />    $xxoo = 0;<br />    for ($i = 0; $i < $bitLen; $i++) {<br />        $xxoo = $xxoo << 1;<br />        if (($n & 1) == 1) {<br />            $xxoo++;<br />        }<br />        $n = $n >> 1;<br />    }<br />    echo “反转后值二进制:”.str_pad(decbin($xxoo),$bitLen,’0′,STR_PAD_LEFT).”<br/>”;<br />    return $xxoo;<br />}<br />

调用测试

echo rev(4);<br />echo rev(43261596);<br />

结果

原始值二进制:00000100<br />反转后值二进制:00100000<br />32原始值二进制:00000010100101000001111010011100<br />反转后值二进制:00111001011110000010100101000000<br />964176192<br />

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:面试题之:颠倒二进制位的实现思路讲解(PHP通用版)

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址