有几个学问 恶补下: (引荐进修:PHP视频教程)
1、一个数字占一个字节,也就是8位
打个比如 ,十进制数字 1 ,在计算机应用二进制示意 是 00000001 (假如十进制转二进制都忘了,请自行百度,这个忘了下面你看不懂~~~)
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通用版)的细致内容,更多请关注ki4网别的相干文章!