写一个函数判断一个数是否是2的乘方

    技术2022-05-18  11

    我的一个朋友在面试程序员的时候经常会问这样的一个问题。显然很多人会感到奇怪,会是这样一个简单的问题,当然,我想谈的不是这些。

    当他告诉我这个问题的时候,我马上就想着怎么来看待这个问题,如果你是开发者的话,你看到这个标题的时候可能就已经想到答案了。

    想了几分钟后,我觉得如果用位运算来解决这个问题的话,会让面试官对你的感觉很好的。接下来我会做一些有意思的实验来验证验证为什么我感觉位运算比较好。

    我想到的第一个方法是:

    def power_of_2?(number) return false if number == 0 while(number % 2 == 0) number = number / 2 end return false if number > 1 true end在此用了迭代的方法来解决了这个问题。我学的第一门语言是JAVA,然后才是C,可能你会觉得我意在“迭代方法”,所以,每当我遇到一个新的问题,我都会尝试着先用迭代来解决。你也会认为我是在用最自然的方式来解决一个问题。

    我想到的第二个方法是:

    def power_of_2?(number) return true if number == 1 return false if number == 0 || number % 2 != 0 power_of_2?(number / 2) end

    问题又一次得到解决,但这次用到的是递归。在学JAVAC之前,我学了很多种其他语言,递归是比较常见而且流行的,而且它使代码看

    起来更加简洁。

     

    接下来的方法不是基于代码的

    最近,我开始研究一些位运算,它常常让我们觉得是不值得这么麻烦来用位来解决这一的问题的,但是自从我看了一篇文章Bloom Filters 

    而且我还得到一本书““Programming Pearls””,我开始对位转移感兴趣。所以,每当我听说关于“2的乘方“或类似的问题的时候,我觉得

    用位运算也可以解决。

    以下是一些以二进制的形式表示的2的乘方的数:

    2 = 00000010 4 = 00000100 8 = 00001000 16 = 00010000 256 = 100000000

    当我减去一的时候,会得到以下的二进制数

    2 - 1 = 1 = 00000001 4 - 1 = 3 = 00000011 8 - 1 = 7 = 00000111

    然后,当我们拿一个2 的乘方的数字和这个数减去1 的数,都以二进制表示后进行与操作后,会发现一个有趣的现象,结果变成0.

    2 & 1 = 00000010 & 00000001 = 0 8 & 7 = 00001000 & 00000111 = 0

    而这些数值可能是2的乘方,以下是代码实现

    def power_of_2?(number) number != 0 && number & (number - 1) == 0 end

    这是一个非常好的方法来判断一个数是否是2的乘方。在过去,电脑资源不足,每个程序员会考虑到效率,比较喜欢这样,而现在,

    已经很少人会在乎这点损失了。但是你不得不承认,这是这三种解决方法中最简洁的。

     

    感谢:http://www.skorks.com/2010/10/write-a-function-to-determine-if-a-number-is-a-power-of-2/

     

     

     

     

     

     

     

     

     


    最新回复(0)