Power of Two 二的幂

来源:互联网 发布:热血屠龙光翼进阶数据 编辑:程序博客网 时间:2024/04/30 05:32

最近做到一个算法题,要求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。

 

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

 

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

 

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

 

原创粉丝点击