查找一个数是否是没有math函数或日志函数的幂

我想查找一个用户input的数字是否是2的幂。

我的代码不起作用。

public class power_of_two { public static void main(String args[]) { Scanner in=new Scanner(System.in); System.out.println("Enter the number : "); int num = in.nextInt(); int other = 1; if(((~num) & 1) == 1) { System.out.println("The number is a power of two"); } else { System.out.println("The number is a NOT A power of two"); } } } 

让我知道如何find两个数字的力量。
例如8是2的幂。
22 不是 2的幂等。

你可以testing一个正整数n是否是2的幂

 (n & (n - 1)) == 0 

如果n可以是非正数(即负数或零),您应该使用

 (n > 0) && ((n & (n - 1)) == 0) 

如果n确实是2的幂,那么在二进制中它将看起来像:

 10000000... 

所以n - 1看起来像

 01111111... 

当我们按位与他们:

  10000000... & 01111111... ----------- 00000000... 

现在,如果n 不是 2的幂,那么它的二进制表示除了前导1还有一些其他的1,这意味着nn - 1将具有相同的前导1位(因为减1将不可能closures这个位,如果在二进制表示中有另一个1)。 因此,如果n不是2的幂,则操作不能产生0 ,因为nn - 1的两个前导位将自己产生1 。 这当然假定n是正数。

在维基百科上, “快速algorithm检查一个正数是两个幂”也解释了这一点。


快速完整性检查:

 for (int i = 1; i <= 100; i++) { if ((i & (i - 1)) == 0) System.out.println(i); } 
 1
 2
 4
 8
 16
 32
 64

您可以使用bitwise AND (&) operator

 return (num & -num) == num 

为什么这个工作?

考虑数字8,二进制(假设是32位)是什么?

 0000 0000 0000 0000 0000 0000 0000 1000 

现在让我们看看-8是如何表示的? 1

 1111 1111 1111 1111 1111 1111 1111 1000 

最后..让我们来计算8 & -8

 0000 0000 0000 0000 0000 0000 0000 1000 8 ↓↓↓↓ ↓↓↓↓ ↓↓↓↓ ↓↓↓↓ ↓↓↓↓ ↓↓↓↓ ↓↓↓↓ ↓↓↓↓ & 1111 1111 1111 1111 1111 1111 1111 1000 -8 --------------------------------------- 0000 0000 0000 0000 0000 0000 0000 1000 8 ¯\_(ツ)_/¯ 

现在让我们举另一个例子,比方说7 ,这不是2的幂。

 0000 0000 0000 0000 0000 0000 0000 0111 7 ↓↓↓↓ ↓↓↓↓ ↓↓↓↓ ↓↓↓↓ ↓↓↓↓ ↓↓↓↓ ↓↓↓↓ ↓↓↓↓ & 1111 1111 1111 1111 1111 1111 1111 1001 -7 --------------------------------------- 0000 0000 0000 0000 0000 0000 0000 0001 != 7 ¯\_(ة_ة)_/¯ 

正如@arshajii所说,如果num为零,会发生什么情况..我将为您解决问题:)

1记住如何计算的好方法:从最右边的位开始,对于你看到的每一个0,不要改变它,当你看到1时,离开它并继续,但是从现在开始,反转所有的位。 我试图在这里解释更多。

 double input = 22; while(((input != 2) && input % 2 == 0) || input == 1) { input = input /2; } return input == 2; 

保持2分,直到你达到1或奇数。 如果它达到1是2的幂,否则不是。

简单的解决scheme:

 bool isPowerOfTwo(int n) { // All values < 1 cannot be (positive, at least) powers of two. if (n < 1) return false; // Keep shifting bits. while (n > 1) { // Since n > 1, the low bit set means at least two bits must // be set, making n no longer a power of two. if (n & 0x1) return false; // Throw away the bottom (zero) bit. n >>= 1; } // Only one bit was set, therefore, n is a power of two. return true; } 

当然,这不像其他一些比较小巧的解决scheme(这确实很聪明)的最佳解决scheme,但是很容易看出它是如何工作的,并validation它是如何工作的。

对于input4 ,我们得到:

 n = 4 (0x100) run loop n = 2 (0x10) run loop n = 1 (0x1) return true 

对于一个无效的input,如5 ,我们得到:

 n = 5 (0x101) return false (0x101 & 0x1 => 0x1, which is truthy) 
  public boolean isPowerOfTwo(int n){ boolean isPower=false; int temp=n; while(temp>=2){ if(temp%2==0){ isPower=true; }else{ isPower=false; break; } temp=temp/2; } if(isPower){ System.out.println("power of 2"); }else{ System.out.println("not power of 2"); } return isPower; } 

非常简单的解决scheme。

 int n = 8; // any integer and you can take it from user also for(;n>0;n++){ if(n%2 != 0) { System.out.println("not a power of two") return; } // if ends here n = n/2; }// for ends here System.out.println("power of two")