当前位置: 首页 > 后端技术 > PHP

一道看似简单的面试题

时间:2023-03-29 14:18:24 PHP

前言使用PHP,给定一个数,判断该数是否为2的N次方。这道看似简单的面试题,其实引出了很多基础知识。本章为大家解答这个有基础知识的问题。首先显示答案functionexponentiation($number){if($number<0){returnfalse;}if(($number&($number-1))==0){返回真;}else{返回错误;}}求幂(2);取幂(8);取幂(16);取幂(32);求幂(128);这道面试题真正考量的不是算法,而是你作为开发者的“基础”够不够。应该在每种语言的helloworld之后立即学习运算符。运算符的种类很多,例如赋值运算符、比较运算符等。我想大部分没有经过系统学习而自学或者训练出道的童鞋应该在这方面知识比较薄弱。当然赋值和比较我是很熟悉的,因为业务基本都逃不过这些。但是你真的了解位运算符吗?本题第一个考点是位运算符的使用。上面说了,这道题不是算法,而是你对二进制的理解,而PHP中能操作二进制的运算符好像(据我所知)只有BitwiseOperatorsPHPBitwiseOperators(Part)这道面试题用的是&,所以其他操作符我就不详细解释了。更多信息请到官方http://php.net/manual/zh/lang...operatorAdditionalInformation&BitwiseANDOperator^BitwiseXOROperatorBitwiseandBitwiseAND简单易懂,是不同二进制位的偏移量,相同的预留。举几个栗子公式->转换为二进制公式后->二进制结果->十进制结果2&3->0010&0011->0010=210&7->1010&0111->0010=232&70->0100000&1000110->0000000=0按位异或按位异或是一种简单易懂的方法来抵消相同的二进制位,并保持差异。举几个栗子。公式->转换为二进制公式->二进制结果->十进制结果2^3->0010^0011->0001=110^7->1010^0111->1101=1332^70->0100000^1000110->1100110=102base借用百度百科的一段话二进制是计算技术中广泛使用的一种数制。二进制数据是用0和1两位数字表示的数,它的基数是2,进位规则是“二得一”,借位规则是“借一为二”。二进制本身就是用来表示数字2的,所以说这道面试题直接提到二进制的使用是正确的。2的n次方是n次方的结果12222x2432x2x2842x2x2x216转换成二进制形式是n次方的结果1200001022x200010032x2x200100042x2x2x2010000从这里我们可以看出2的n次方的二进制最高位为1,其余补齐0,(n&(n-1))==0且n>0,一定是2的n次方,为什么是-1?在二进制中,每一位必须不同&将导致0。&的运算结果在上面已经解释过了。比如十进制1616&(16-1)=010000&(001111)=0不用担心公式(n&(n-1))==0是怎么来的。作为一个程序员,我觉得我应该花更多的时间来逆向推导来证明这个公式的正确性。验证是否是2的n次方,比较笨的方法是一直除以2,等到最后除以0的时候就是2的n次方。所以,如果上面的公式是填2个二进制数,电脑会统一位数,比如01011<------>001011电脑会自动用001补01,方便计算。在二进制中,第一个数字是1表示负数,0表示正数。如果没有补零,1000000000001111111111计算后也是0,但不是2的n次方,因为第一组二进制数是负数。补充另一个问题由上面的问题补充。给定任意一个数,计算的是2的多少次方?functionpower($number){如果($number<0){returnfalse;}if(($number&($number-1))==0){//如果你数学不好,看下面的方法//$number=decbin($number);//返回(mb_strlen($number)-1);//对于数学,请参阅以下方法returnfloor(log($number,2));}else{返回false;}}判断是否是2的n次方,如果是,将十进制转二进制计算总长度-1得到2的n次方个数,按照0的个数计算,谢谢看到这里,我也是文中提到的一个基础没有学好的程序员,但是当你看了我的文章,希望你也能打起精神,复习一下基础,对你以后的职业生涯起到一定的作用。本章内容纯属本人理解。如有不妥,请大家监督批评,谢谢?