如何判断一个正整数是否是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
代码实现在上面代码里- 如何判断一个正整数是否是2的乘方
- 判断一个正整数是否是2的乘方
- 如何判断一个正整数是否是4的幂?
- 算法——一个正整数,如何判断是不是2的乘方
- 判断一个数是2的乘方
- 写一个函数判断一个数是否是2的乘方
- 判断一个数是否是2的正整数次幂
- 如何快速判断一个数是不是 2 的乘方?
- 判断一个正整数是否是4的n次幂
- 判断一个数是否是正整数
- 判断一个正整数是否是质数
- 判断一个正整数是否是回文数
- 判断一个正整数是否是回文数
- 判断输入的一个非负的正整数,其是否是2的幂
- 判断一个long类型正整数是否是2的n次方——华为笔试归来
- 如何判断一个值 是否为正整数
- 判断一个数是不是2的乘方
- 如何判断一个正整数数x是否为2的幂
- 使用tomcat访问本地的html或者jsp文件
- Java网易短信接入demo
- linux修改profile文件出错后所有命令用不了
- basename命令和函数
- 手机号和用户名验证
- 如何判断一个正整数是否是2的乘方
- Scrapy框架安装遇到的问题
- c++操作符重载的两种类型
- Objective-C Runtime
- hashmap和hashtable的区别
- HDU
- recv函数返回值总结
- Unity|ShaderLab笔记整理-三(逐像素漫反射+环境光)
- Hive将txt、csv等文本文件导入hive表