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

资源魔 40 0
这是一个面试题,有学员示意不克不及了解。 简略给各人培训下,并非很难,然而要写欠缺比拟考验根底功底,也需求有些逻辑思想才能,因为学员的标的目的是PHP,那末就用PHP来说解下,同时也是通知各人 学PHP并非说只需会写两句 echo “hello world”,或许轮回输入到网页就叫会PHP了。

有几个常识 恶补下: (保举学习:PHP视频教程)

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

打个比如 ,十进制数字 1 ,正在较量争论机行使二进制示意 是 00000001 (假如十进制转二进制都忘了,请自行baidu,这个忘了上面你看没有懂~~~)

PHP中能够用

echo bindec("00000001");   //bindec函数能够让你领会到 二进制以及10进制之间的 骚转换

二、十进制数字相加 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,请问怎样玩?

谜底网上都烂大巷了,接上去讲下思绪:

一、起首要有2个变量,

1)暂时变量叫做 $xxoo , 初始值是0(十进制),二进制也就是00000000

2)原始值 变量,叫做$shit , 就是要做解决的 00000101

二、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通用版)的具体内容,更多请存眷资源魔其它相干文章!

标签: php开发教程 php开发资料 php开发自学 二进制 算法

抱歉,评论功能暂时关闭!