理解java代码 - 检查整数是否为2的幂

时间:2016-02-29 01:18:49

标签: java debugging operators

我在Leetcode.com

看到了这个有效编写的代码
public static boolean isPowerOfTwo(int n) {
            return n>0 && ((n&(n-1))==0);
        }

这个工作非常好但我无法弄清楚单个'&'的工作情况在代码中。 有人可以努力解释代码是如何工作的吗?

并且通过相同的逻辑来确定整数是3的幂是什么?

5 个答案:

答案 0 :(得分:3)

&在Java中是一个按位和运算符。它需要两个整数并对每个位执行和操作,产生一个int,其中每个位设置为' 1'当且仅当该位是' 1'在两个操作数中。该代码使用的理解是二进制中的任何2的幂都是' 1'其次是一些' 0。这意味着减1将改变数字的所有位。对于任何2的非幂,在第一个之后将至少有一个非零数字,因此第一个数字将保持不变。由于在两个不同的值上执行AND总是产生' 0',当且仅当该数字是2的幂时,并且原始数字和自身减去1将产生0。因为这是具有二进制数的技巧,所以它不适用于寻找其他基数的能力。

答案 1 :(得分:3)

单身&是一个按位'和'运算符(而不是&&,它作用于布尔值)。

所以当你使用&在两个整数上,结果是它们的二进制表示的逻辑'和'。

此代码有效,因为2的任何幂都是1,后跟二进制的一些0(例如,4是100,8是1000等)。任何2的幂,少于1,将只是全1(例如,3是11,7是111)。 所以,如果你取2的幂,并且按位并且它本身减1,你应该只有0.但是,除2的幂之外的任何东西都会得到非零的答案。

例:
1000 = 8
0111 = 7(8-1),并且'&'这些给出了 0000 = 0

但是,如果你有像6这样的东西(不是2的幂):
110 = 6
101 = 5(6-1),并且'&'这些给出了 100 = 4(不等于0,因此代码将返回false)。

我希望说清楚!

答案 2 :(得分:1)

要了解此函数的工作原理,您需要了解二进制数的表示方式。如果您不这样做,我建议您阅读Learn Binary (the easy way)等教程。

所以说我们有一个数字8,我们想知道它是否是2的幂。我们先将它转换为二进制:1000。现在让我们看一下8-1 = 7的二进制形式:0111&运算符用于二进制AND。当我们将AND运算符应用于87时,我们得到:

 1000
 0111
&----
=0000

2幂的每个整数都是1,后跟非负数量的零。当您从该数字中减去1时,您将始终获得0,后跟一系列1 s。由于将AND操作应用于这两个数字将始终为您提供0,因此您始终可以验证它是2的强大功能。如果该数字不是2的幂,当您从中减去1时,它将不会反转所有数字,AND测试将产生正数(失败)。

答案 3 :(得分:0)

它是一个按位运算符:

如果我们将2指数3等于8, 例如2 3 = 2×2×2 = 8

现在计算8是2的幂,它是这样的:

n&(n-1) - > 8和(8-1) - > 1000和0111 = 0000 因此它满足条件 - > (N及(N-1))== 0

答案 4 :(得分:0)

单曲"&"执行按位AND操作,这意味着在A&的结果中。 B与A和B为整数,只有那些位将被设置为1,其中A和B都有1。

例如,让我们看一下数字16:

16& (16 - 1)=

00010000&
00001111 =
00000000

这适用于2的幂,因为任何2减1的幂将设置所有低位,或者换句话说n位可以表示n个不同的值,包括零,因此(2 ^ n)-1是最高值当它们全部设定时,可以用n位表示。

我希望这会有所帮助。

由于我们的计算机不使用三元数,因此三个方面的功能有点麻烦。基本上三的幂是任何三元数,只有一个数字不等于零,并且该数字是" 1"就像在任何其他数字系统中一样。 从我的头脑中,我不能提出任何比重复做模3更优雅的东西,直到你得到一个作为除法结果(在这种情况下你有3的力量)或非零模数结果(这意味着它不是三的幂)。 也许这也有帮助:http://www.tutorialspoint.com/computer_logical_organization/number_system_conversion.htm