Power of Four

来源:互联网 发布:美丽港发型设计软件 编辑:程序博客网 时间:2024/05/01 15:03

Given an integer (signed 32 bits), write a function to check whether it is a power of 4.

Example:
Given num = 16, return true. Given num = 5, return false.

Follow up: Could you solve it without loops/recursion?




n&(n-1) 作用为去掉二进制n的最右边的1

1-1=0   0&1=0

10-1=01 01&10=00

11-1=10  10&11=10

对所有最低边位有1 的二进制,减去1为0. 最低位1&0=0;

对不是最低位有1 的二进制,减去1为 XXXX1000-> XXXX0111   两者相与 为  XXXX0000


当n&(n-1)为0 时, 代表去掉最右边的1 之后没有1了

意思是整个二进制只有一个1,则n为2的幂


2的幂一定不能被3整除

而4^k-1=(4^(k/2)-1)(4^(k/2)+1)

            =(4^(k/4)-1)(4^(k/4)+1)(4^(k/4)+1)

            =(4-1)(....)

所以4^k=3(...)+1


2的幂有2的奇数次幂和2的偶数次幂,2的偶数次幂就是4的幂

只要我们证明2的奇数次幂减去1不能被3整除就能判断

证明:2^(2k+1)-1 不能被3整除

http://blog.csdn.net/ChuQiDeCha/article/details/51255135 该博主已证明


所以该题答案为:

bool isPowerOfFour(int num) {    return num > 0 && (num & (num - 1)) == 0 && (num - 1) % 3 == 0;}



0 0