342. 4的幂
思路:
哭了,我只想能想到循环,想到位运算也只能想到循环位移。
然后就去看题解了。
题解是使用 判断是否为2的幂的方法,又哭了,我不是写过这个题了吗......
好吧,那这次就在巩固一次。
用的方法是定义一个常数 用16进制表示就为(0xaaaaaaaa),换成二进制0xa=1010,相当于我4的倍数的都为0,写长一点更容易发现规律,1010,1010,把每个位转为十进制就是128 64 32 16 8 4 2 1,那么就是64 16 4 1的位置为0,现在也可以看清楚了,我么们在为4的幂的位上置0,我们将它和传入的数n进行相与,那么就能得到如果他是4的幂,他就为0否则为1。但你会发现这存在一个问题,例如输入的n=5=(0101)那么此时相与也为0了,因此我们还需要额外的判断最后一位为不为0。
那么我们通过n&(n-1)==0来解决,如果它最低位为1,那么计算后会得到n-1,如果是4的倍数-1,那么相与就为0,因此这就解决了边际条件。因为4的幂比不可能小于0,所以n>0先过滤掉。
代码:
class Solution {
public:
bool isPowerOfFour(int n) {
return (n>0)&&((n&(n-1))==0)&&((n&0xaaaaaaaa)==0);
}
};
根据n=4x=(3+1)x,可知对于4的幂的数模3等于1,因此我们通过模3来判断是否等于1来判断是否为4的倍数。我们上面通过n&(n-1)可以判断是否这个数的二进制数只有一位为1,这样就能去除掉奇数,只留下偶数,那么再从偶数模三即可判断是否为4的幂了。
class Solution {
public:
bool isPowerOfFour(int n) {
return n>0&&(n%3==1)&&(n&(n-1))==0;
}
};