public static boolean isPowerOfTwo(int n) {
return n>0 && ((n&(n-1))==0);
}
这个工作非常好但我无法弄清楚单个'&'的工作情况在代码中。 有人可以努力解释代码是如何工作的吗?
并且通过相同的逻辑来确定整数是3的幂是什么?
答案 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
运算符应用于8
和7
时,我们得到:
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