转载:http://www.cnblogs.com/hackbuteer/articles/2081370.html
最快速的方法:(number & number - 1 ) == 0
原因:因为2的N次方换算是二进制为10……0这样的形式(0除外)。与上自己-1的位数,这们得到结果为0。例如。8的二进制为1000;8-1=7,7的二进制为111。两者相与的结果为0。计算如下。
1000 & 0111 ------- 0000
使用递归来实现的代码如下:
1 #include " stdio.h " 2 #include " stdlib.h " 3 4 int log2( int value) // 递归判断一个数是2的多少次方 5 { 6 if (value == 1 ) 7 return 0 ; 8 else 9 return 1 + log2(value >> 1 ); 10 } 11 12 int main( void ) 13 { 14 int num; 15 printf( " 请输入一个整数: " ); 16 scanf( " %d " , & num); 17 if (num & (num - 1 )) // 使用与运算判断一个数是否是2的幂次方 18 printf( " %d不是2的幂次方!\n " ,num); 19 else 20 printf( " %d是2的%d次方!\n " ,num,log2(num)); 21 system( " pause " ); 22 return 0 ; 23 }
使用非递归来实现的代码如下:
1 #include " stdio.h " 2 #include " stdlib.h " 3 4 int log2( int value) // 非递归判断一个数是2的多少次方 5 { 6 int x = 0 ; 7 while (value > 1 ) 8 { 9 value >>= 1 ; 10 x ++ ; 11 } 12 return x; 13 } 14 int main( void ) 15 { 16 int num; 17 printf( " 请输入一个整数: " ); 18 scanf( " %d " , & num); 19 if (num & (num - 1 )) // 使用与运算判断一个数是否是2的幂次方 20 printf( " %d不是2的幂次方!\n " ,num); 21 else 22 printf( " %d是2的%d次方!\n " ,num,log2(num)); 23 system( " pause " ); 24 return 0 ; 25 }