此处想到三种方法实现
方法一:
2的n次幂,2^0->1,2^1->2 ,2^2(2 * 2)->4,2^3(2 * 2 * 2)->8,2^4(2 * 2 * 2*2)->16 .....
因此可以将传入的值不断和n * 2 做对比,只要相等就为2^n
public static boolean f3(int a) { boolean b = false; int x = 2; while(true){ if(a == 1 || x == a){ b = true; break; }if(x < a){ x = 2 * x; }else{ b = false; break; } } return b; }
方法二:
将2^n转换成二进制
2^0->1->1,2^1->2 ->10,2^2->4->100,2^3->8->1000,2^4->16->10000
因此可以将值转换成二进制字符串,判断第二个数字以后都是0即表示是2^n,需要注意2^0,因此一开始可以将boolean设置为true
public static boolean f3(int a) { boolean b = true; String s = Integer.toBinaryString(a); byte[] bytes = s.getBytes(); for (int i = 1; i < bytes.length; i++) { if (bytes[i] != 48) { b = false; break; } } return b; }
方法三:
通过运算来实现
转换成二进制
2^0->1->1,2^1->2 ->10,2^2->4->100,2^3->8->1000,2^4->16->10000此时如果使用
1 & 0 = 0
2 (10) & 1 (1) = 0
3(11) & 2(10) != 0
4(100) & 3 (11) = 0
5(101)& 4(100) !=0
6(110) & 5(101) !=0
7(111)& 6 (110) != 0
8(1000) & 7(111) = 0
因此 可以使用(n & (n - 1))计算
public static boolean f2(int a) { return (a > 0) && (a & (a - 1)) == 0; }