百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>网页制作> 面试题之:颠倒二进制位的实现思绪解说(PHP通用版)
分享文章到:

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

发布时间:09/01 来源:未知 浏览: 关键词:
这是一个面试题,有学员表示不克不及懂得。 简便给大家培训下,并不是很难,但是要写完美比力考查根基功底,也需要有些逻辑思维能力,由于学员的标的目的是PHP,那么就用PHP来讲解下,同时也是告诉大家 学PHP并不是说只要会写两句 echo “hello world”,或者轮回输出到网页就叫会PHP了。

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

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

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

PHP中可以用

echo bindec("00000001");   //bindec函数可以让你体味到 二进制和10进制之间的 骚转换

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)
{
$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
反转后值二进制:00100000
32原始值二进制:00000010100101000001111010011100
反转后值二进制:00111001011110000010100101000000
964176192

以上就是面试题之:颠倒二进制位的实现思绪讲解(PHP通用版)的具体内容,更多请关注百分百源码网其它相关文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有151人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板