Algorithm 一个数字是否可以用2的幂n表示?这种逻辑是如何运作的?
我们知道,检查一个数字可以用2的幂表示,也可以不用。为了解决这个问题,我们使用位操作,使之快速Algorithm 一个数字是否可以用2的幂n表示?这种逻辑是如何运作的?,algorithm,data-structures,bit-manipulation,Algorithm,Data Structures,Bit Manipulation,我们知道,检查一个数字可以用2的幂表示,也可以不用。为了解决这个问题,我们使用位操作,使之快速 if( n && !(n&(n-1))) print("yes number can be express 2 to power"); print("No number can not be express 2 to power"); 我的问题是它是如何工作的。为什么是n&(n-1)?为什么不使用n&(n-2)或其他任何东西。 任何想法都将不胜感激 提前谢谢 这可以通过查看形
if( n && !(n&(n-1)))
print("yes number can be express 2 to power");
print("No number can not be express 2 to power");
我的问题是它是如何工作的。为什么是n&(n-1)?为什么不使用n&(n-2)或其他任何东西。
任何想法都将不胜感激
提前谢谢 这可以通过查看形式为2^n的数字的位表示来理解。它们的形式为10000…000,即一个“1”后跟n-1个零。2^n-1将是01111…111,即一个“0”后跟n-1。当你对这些数字(1000…0000和01111…111)按位取AND时,你得到一个零。与
n
的位模式相比,在n-1
中,包括最后一个1
在内的所有右位都将被翻转。左边的位不变。比如说
n 01001000
n-1 01000111
因此,如果在n
的位模式中有多个1
,则表达式n&(n-1)
将非零
一种特殊情况是值0,它不是2的幂,但表达式给出0。所以它在这种情况下不起作用。@xenteros是的,它对n=1不起作用,但它可以用2的幂n表示,我们知道Math.pow(2,0)=1@xenteros是的,先生,我应该限制n=1。Thanks@user5956891这是不正确的。它适用于
n=1
。但是,正如上面链接的答案中所述,n=0
是错误的。如果(!(n&(n-1))&&n),您可以添加一个简单的检查,其中&&n
检查所有真实情况,并且仅当n
为非零时才返回真。@Jedi我认为应该有(n&!(n&(n-1))而不是(!(n&(n-1))在我的问题中,正如你所建议的。我用反算例进行了检查,如果n不是零,那么你的逻辑是正确的。Thanks Remember,顺序关系到@user5956891。你所做的编辑比上面的评论更有效。如果你首先检查n==0
你大多数时候都在执行额外的检查。更好的顺序是执行n==0
o仅适用于二次幂(和零)。很好的解释谢谢。是的,你是对的,2^n=10000…000和(2^n)-1是01111…111。在1的情况下,它是否工作,其中1也是n=0的幂n。@user5956891不,正如亨利在回答中解释的那样。