如何判断一个正整数是否是2的乘方

来源:互联网 发布:淘宝的淘宝客在哪里 编辑:程序博客网 时间:2024/05/23 15:49

实现一个方法,判断一个正整数是否是2的乘方(比如16是2的4次方,返回True;否则返回False)

方法一:使用该数循环除以2,如果最终商是1并且余数是0,则返回True;循环中一旦出现余数不为0,则返回False

方法二:从1开始循环乘以2,直到结果第一次大于或者等于目标值,如果相等,则放回True,如果大于,则返回False

方法三:借助位运算

如果该数是2的乘方,则该数的二进制表示仅包含一个1,那么该数与他的减一的数相与,一定为0; 否则该数一定不是2的乘方

以数字5为例:                            以数字8为例

    0000 0101                              0000 1000

 &                                            &

   0000 0100                               0000 0111

= 0000 0100                           = 0000 0000

十进制N

二进制N

是否是2的乘方

4

10

8

100

16

1000

32

10000

 

十进制N

二进制N

二进制N-1

N & N-1

是否是2的乘方

4

100

011

0

5

101

100

100

8

1000

0111

0

10

1010

1001

1000

16

10000

01111

0

与方法一二比较,通过该方法只需要一次运算即可得出结果

Python代码及耗时统计如下:

#!/usr/bin/python#-*- coding:utf-8 -*-import timedef isPowerOf2_1(i):    if i < 1:        return False    while i > 1:        if(i % 2):            return False        i = i / 2    return Truedef isPowerOf2_2(i):    j = 1    while j < i:        j = j * 2    if j == i:        return True    return Falsedef isPowerOf2_3(i):    if i < 1:        return False    if(i & (i - 1)):        return False    return Truedef computeNum1(i):    num = 0    while(i):        num += 1        i = i & (i - 1)    return numif __name__ == "__main__":    num = 20000000    lst1 = list()    start = time.time()    for i in range(num):        if (isPowerOf2_1(i)):            lst1.append(i)    end = time.time()    print "used time: %s" % (end - start), lst1    lst2 = list()    start = time.time()    for i in range(num):        if (isPowerOf2_2(i)):            lst2.append(i)    end = time.time()    print "used time: %s" % (end - start), lst2    lst3 = list()    start = time.time()    for i in range(num):        if (isPowerOf2_3(i)):            lst3.append(i)    end = time.time()    print "used time: %s" % (end - start), lst3    print computeNum1(142)    print computeNum1(143)    print computeNum1(128)
运行结果

"D:\Program Files\python 2.7.13\python.exe" D:/userdata/shayu/Desktop/pow2.pyused time: 12.3350000381 [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608, 16777216]used time: 46.5840001106 [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608, 16777216]used time: 7.85400009155 [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608, 16777216]451Process finished with exit code 0

拓展: 如何计算一个正整数的二进制表示含有多少个1?

借助方法三,一个正整数N与N-1相与的结果是1的个数减一,那么我们可以不断的相与直至结果为0,就可以统计1的个数了

142的二进制表示为1000 1110

    1000 1110      4个1

& 10001101

    1000 1100      3个1

& 1000 1011

    1000 1000      2个1

& 1000 0111

    1000 0000      1个1

&  0111 1111

    0000 0000      0个1

代码实现在上面代码里


原创粉丝点击