int a 判断a是否是2的n次幂(a 是一个正整数)

时间:2022-03-06 15:09:46

此处想到三种方法实现

方法一:

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;
}