if(n&(n-1)) then n不是2的幂数;
else n是2的幂数;
原理:如果n=2^K,那么n = 1000...0(k个0),则n-1 = 111...0(k个1);相与之后则为0
如果 n!=2^k,那么
n跟(n-1)第一位都为1,则相与这后然后第一位为1,则不为0.
【更正】
上面当n==0也会误判成2的幂数,所以应该更正为:
if( !n && n&(n-1)) then n不是2的幂数;
else n是2的幂数;
if(n&(n-1)) then n不是2的幂数;
else n是2的幂数;
原理:如果n=2^K,那么n = 1000...0(k个0),则n-1 = 111...0(k个1);相与之后则为0
如果 n!=2^k,那么
n跟(n-1)第一位都为1,则相与这后然后第一位为1,则不为0.
【更正】
上面当n==0也会误判成2的幂数,所以应该更正为:
if( !n && n&(n-1)) then n不是2的幂数;
else n是2的幂数;