• 2的整数次幂三种写法


    实现一种方法,判断一个整数是否是2的整数次幂(823次方,返回ture,9不是2的
    整数次幂,返回false),要求性能尽可能的高。
    利用一个整型变量,让它从1开始不断乘以2,将每一次乘2的结果和目标整数进行对比就可以了
    具体做法:
    创建一个临时变量temp,初始值定义为1。然后进入一个循环,每次让
    temp乘以2,然后个我们的目标值比较,如果相等,则说明我们的目标整数
    是2的整数次幂;如果不等,则让我们的temp值变大,继续循环和比较。
    当我们的temp值大于目标整数是,说明我们的目标整数不存在。
    举个例子
    给出我们的整数为11
    1*2=2
    2*2=4
    4*2=8
    8*2=16
    16>11,所以我们11不是2的整数次幂
    如果我们的整数大小是n,我们的时间复杂度就是O(logn)def is_power_of_2(num):
        temp = 1
        while temp <= num:
            if temp == num:
                return True
            temp = temp * 2
        return false
    print(is_power_of_2(11))
    print(is_power_of_2(8))
    
    能不能优化一下,使它的执行速度更快?
    可不可以把乘以2的操作变成向左移位,移位的操作比乘法高的多
    
    def is_power_of_2(num):
        temp = 1
        while temp <= num:
            if temp == num:
                return True
            temp = temp << 1
        return False 
    print(is_power_of_2(8))
    print(is_power_of_2(11))
    
    有没有一种更高效的方法呢,实现时间复杂度为O(1)
    
    如果把2的整数次幂转换成2进制数,会有什么特点
    
    
    十进制数        二进制数        是否为2的整数次幂
    8               1000B           是
    16              10000B          是
    32              100000B         是
    64              1000000B        是
    100             1100100B        否
    
    如果一个整数是2的整数次幂,那么它变成二进制时,只有最高位是1,其它位都是0
    如果我们把这些2的整数次幂都各自减1,再转换成二进制数会有什么特点
    十进制数        二进制数        原数值-1       是否为2的整数次幂
    8               1000B           111B           是
    16              10000B          1111B          是
    32              100000B         11111B         是
    64              1000000B        111111B        是
    100             1100100B        1100011B       否
    
    2的整数次幂一旦减1,它的二进制数字就全部变成1
    
    如果用原数值(2的整数次幂)和它减1的结果进行按位与运算,n&(n-1),结果是什么
    
    十进制数    二进制数    原数值-1   n&n-1   是否是2的整数次幂
    8           1000B       111B       016          10000B      1111B      032          100000B     11111B     064          1000000B    111111B    0100         1100100B    1100011B   1100000B     否
    
    01按位与运算结果是0,所以凡是2的整数次幂和它本身减1的结果进行与位运算,结果肯定都是
    0,反之,如果一个整数不是2的正数次幂结果一定不是0.
    所以我们如何判断一个整数是否是2的整数次幂?
    对于一个整数n,只需要计算n&(n-1)的结果是不是0,这个算法的时间复杂度就是1
    def is_power_of_2_v3(num):
        return (num & num-1) == 0
    print(is_power_of_2_v3(8))
    print(is_power_of_2_v3(11))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
  • 相关阅读:
    回调函数和钩子函数
    Vue3.0 项目启动(打造企业级音乐App)
    “九韶杯”河科院程序设计协会第一届程序设计竞赛题目分析以及总结
    SQL Server关于AlwaysOn的理解-读写分离的误区(一)
    若依项目里面的数据权限注解@DataScope 注解的实现原理 与 使用逻辑
    springboot大学生就业规划系统毕业设计-附源码191451
    Nginx错误日志说明
    Python 队里 list的常规操作 pop,insert,remove,index
    Linear Model 线性模型
    java自定义Excel导出实现方案汇总
  • 原文地址:https://blog.csdn.net/qq_34562355/article/details/127947350