查找一个数是否是没有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,这意味着n
和n - 1
将具有相同的前导1位(因为减1将不可能closures这个位,如果在二进制表示中有另一个1)。 因此,如果n
不是2的幂,则操作不能产生0
,因为n
和n - 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")