leetcode 342
判断一个数是不是4的n次方
X(一位二进制数,即0或1),和1进行与运算,判断X是0还是1;
和0进行与运算,可以屏蔽X.
X,和0进行或运算,判断X是0还是1;
和1进行或运算,可以屏蔽X.
1、从判断一个数是不是2的n次方-----最高位是1,低位全是0
判断一个数 x 是不是 2 的次幂只需要查看等式 ((x - 1) & x) == 0 是否成立
比如16; 二进制表示为10000.
那么可以使用16-1=15的序列01111,与16运算
2、判断一个数x是不是4的n次方-------最高奇数位为1,其他都为0
先判断x是不是2的n次幂,使用((x - 1) & x) == 0
判断奇数位,可以参照前面的知识,构造序列010101。。。。。101,来判断。在32位字长的数表示中,可以表示为0x55555555.
以及:
(4^n-1) = (4-1) (4^(n-1) + 4^(n-2) + 4^(n-3) + ..... + 4 + 1),即判断(x-1)%3=0
在Java中,
toString函数将num变为4进制数,并保存为字符串。然后在里面进行匹配public boolean isPowerOfFour(int num) { return Integer.toString(num, 4).matches("10*"); }
其中matches的用法,参照链接http://blog.csdn.net/amaowolf/article/details/7758215
3、判断一个数x是不是3的n次方
public class Solution {
public boolean isPowerOfThree(int n) {
// 1162261467 is 3^19, 3^20 is bigger than int
return ( n>0 && 1162261467%n==0);
}
public boolean isPowerOfThree(int n) {
return (Math.log10(n) / Math.log10(3)) % 1 == 0;
}
public boolean isPowerOfThree(int n) {
int[] allPowerOfThree = new int[]{1, 3, 9, 27, 81, 243, 729, 2187, 6561, 19683, 59049, 177147, 531441, 1594323, 4782969, 14348907, 43046721, 129140163, 387420489, 1162261467};
return Arrays.binarySearch(allPowerOfThree, n) >= 0;
}
4、必要的判断
判断x是否大于0.
5、acculate运算