快速判断一个数是否是2的幂次方,若是,并判断出来是多少次方!

本文介绍了一种快速判断一个数是否为2的幂次方的方法,并提供了递归与非递归两种实现方式的C语言代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载: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 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值