一个整数如果是4的幂,以二进制表示的话,数位上有且只有一位为1,而且只在第(2n+1)位上为1。判断二进制数位上有且只有一位为1的简便算法是
x&(x-1)==0,
x-1会将1位后的数位全置为0,再做按位与必为0,反之则必不为0;
java语言里int类型占用32位四个字节。所有4的幂的数位都置为1的数16进制表示为0x55555555.
联合以上两个条件可以快速判断是否为4的幂,即
(x&(x-1)==0) &&(x &0x55555555)!=0
考虑有符号整形,则
(x>0) && (x&(x-1)==0) && (x &0x55555555)!=0
由此也可推广到8次幂,16次幂等快速算法,只需要将与运算的常量改下即可
将4的幂次方写成二进制形式后,很容易就会发现有一个特点:二进制中只有一个1(1在奇数位置),并且1后面跟了偶数个0; 因此问题可以转化为判断1后面是否跟了偶数个0就可以了。4的整数次幂的二进制数都为 (4)100、(16)10000、(64)1000000......
另外,4的幂次方4^n也可以写为2^(2*n),即也可以写为2的幂次方,当然就满足2的幂次方的条件了,即num &num-1==0。
思路:首先用条件num &num-1==0来判断是否为2的幂次方,若不满足,则不是。若满足,在用条件num &0x55555555来判断,若为真,则这个整数是4的幂次方,否则不是。