判断一个数是否为2的N次方问题

来源:互联网 发布:剑灵捏脸数据人男邪气 编辑:程序博客网 时间:2024/06/04 17:46

对于判断一个数是否为2的N次方问题,通常想到的最为直接的办法就是对这个数不断对2取余,为0就将该数变为该数除以2,直到最后该数为1为止。

void judge(int n)  {      while(!(n % 2))      {           n = n / 2;           if(n == 1)           {                 printf("yes!\n);                return;           }      }       printf("NO!\n");       return;  }  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

不过上面的方法并不是较好的方法,其实还有更为简洁高效的方法 
一个整数,若是2的n次方,有没有想过对这个整数的2进制进行考虑,比如12,它的二进制为:1100

2 10 
4 100 
13 1101 
16 10000 
32 100000 
从上面的举例我们发现,凡是2的N次方的整数,其二进制码只有一个1。 
假设A为要证明的整数,B等于A-1,我们假设A为2的N次方数,那么A&B = 0,这很好证明。那是不是满足A&B = 0就能证明A是2的N次方数呢? 
假设一个数的二进制为1000000000000000(这里为int型:两个字节),那这个数减去1则变为0111111111111111。我们知道,在计算机中,数都是以其二进制的补码放置的,最高位为1代表负数,最高位为0代表正数。上面两个数中, 
1000000000000000为负数,0111111111111111为正数,这两个数相与为0,但1000000000000000并不是2的N次方(2的N次方为正数)。 
因此,倘若一个数为2的N次方,那么该数应满足大于0且该数和该数减一后的值相与等于0时才为2的N次方。

void judge(int n)  {      if((n > 0) && (n & (n -1) ==0))     {          printf("Yes!\n");          return;     }     printf("NO!\n");     return;  } 
0 0