Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 一个数字是否可以用2的幂n表示?这种逻辑是如何运作的?_Algorithm_Data Structures_Bit Manipulation - Fatal编程技术网

Algorithm 一个数字是否可以用2的幂n表示?这种逻辑是如何运作的?

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)或其他任何东西。 任何想法都将不胜感激 提前谢谢 这可以通过查看形

我们知道,检查一个数字可以用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不,正如亨利在回答中解释的那样。