【问题标题】:Power of two failed to pass the test二的幂没有通过测试
【发布时间】:2016-11-13 16:13:48
【问题描述】:

这不是测试一个数字是否是 2 的幂的一种方法吗?

boolean isPowerOfTwo(int n) {
        return (n%2==0);
    }

【问题讨论】:

  • 感谢您的诙谐幽默
  • 为什么?我是认真的。
  • 这告诉你一个数是否能被 2 整除,而不是 2 的幂
  • 您正在检查数字是否为偶数。这会说 6,12, 18,.... 是 2 的幂。
  • 这是测试号码是否为even。要测试 2 的幂,请阅读此内容(或使用 google):stackoverflow.com/questions/19383248/…

标签: java algorithm


【解决方案1】:

您确定要检查 2 的幂吗?相反,被检查与2整除。如果你是认真的,使用小菜一碟sn-p

return n > 0 && ((n & -n) == n);

第二种方式,

private static boolean powerOf2(int num)
{
  if(num <= 0){
   return false;
  }

  while(num > 1)
  {
   if(num % 2 != 0)
   {
    return false;
   }
   num = num / 2;
  }
  return true;
}

【讨论】:

  • 让我想办法,我讨厌位操作。
  • 注意:0 时返回 true。
【解决方案2】:

该函数检查整数是否为偶数(即可被 2 整除),而不是整数是否为 2 的幂。

要检查一个数字是否是 2 的幂,您应该查看它的位。 ints 是 2 的幂,其中一位设置为 1,所有其他位设置为 0。

boolean isPowerOf2(int i) {
    return Integer.bitCount(i) == 1;
}

【讨论】:

  • 经过测试,简单但效率低下。甚至比递归版本还要糟糕。
【解决方案3】:

% 是取模运算符,表示除法后的余数。您的方法检查 int n 是否可被 2 整除

【讨论】:

  • 所以我的代码是作为 2 的幂的一个必要但不充分的条件。对吧?
  • 我不会把它放在“必要”类别中,你只是在检查数字是否可以被 2 整除,而不是 2 的幂。它只是在做一些不同的事情。但是有一个二进制规则:如果您的 int 的二进制版本只有一个 1 位,那么它是 2 的幂。这可以使用布尔运算符 n & (n - 1) == 0 进行检查
  • 我的意思是它必须能被 2 整除,这是必要的。
  • @ling 2 的幂实际上是偶数的一个子集——如果你发现一个整数是 2 的幂,你不需要检查同一个整数是否是偶数。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-28
  • 2019-06-23
  • 1970-01-01
  • 2022-01-16
  • 2021-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多