Power of Two 二的幂

本文探讨了一种高效判断一个数是否为二的幂的方法。作者经过多次尝试,最终将判断过程简化为两次位运算:(x-1)&x。文章详细记录了从初次尝试到逐步优化的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近做到一个算法题,要求judge the number whether is the power of two,即判断一个数是否是二的幂。

 

做的时候自己尽量可能地想把时间缩短,因为数据量比较大。

 

第一次。用了移位的方法后,提示Time limit exceeded。

 

第二次。考虑了建立一个数组,直接用数组存储该下标所代表的树是否满足条件的值。比如a[4]=1,a[6]=0。结果还是超时了。

 

第三次。分析了数字和二进制之间的关系:(~x & (x-1))-x+1。假设一个数x=4,用二进制表示为00000100。另一个数是6,用二进制表示为00000110。

 

x                           00000100           00000110

~x                        11111011            11111001

x-1                        00000011           00000101

~x&(x-1)               00000011           00000001

(~x & (x-1))-x       11111111           11111011

(~x & (x-1))-x+1   00000000           11111100

 

            可以得到满足条件的数在进行以上运算后会变为0。

 

            但是结果还是超时。

 

第四次。没办法,继续研究。再次分析:以上的式子进行了五次的运算,所以努力地又把它缩减为四次运算:((~x+1) & x)-x

 

x                           00000100           00000110

~x                        11111011            11111001

~x+1                    11111100            11111010

(~x+1) & x            00000100           00000010

((~x+1) & x)-x      00000000           11111100

 

            可以得到满足条件的数在进行以上运算后会变为0。

 

            但是结果还是超时。

 

第五次。实在没办法,继续压缩。最后居然压缩成了两次运算:(x-1)&x。

 

x                           00000100           00000110

x-1                        00000011           00000101

(x-1)&x                 00000000           00000100

 

            可以得到满足条件的数在进行以上运算后会变为0。

 

            但是结果还是超级失望地超时了。

 

现在还是没能知道怎么弄,不知道是不是那个系统出了问题所以一直没通过。不过想想,自己居然把一个问题完成得这么好,还是蛮开心的!十分值得。

 

只是不知道上面的分析有没有错?

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值