当前位置:  编程技术>c/c++/嵌入式

如何判断一个数是否为4的幂次方?若是,并判断出来是多少次方?

    来源: 互联网  发布时间:2014-10-15

    本文导语:  将4的幂次方写成二进制形式后,很容易就会发现有一个特点:二进制中只有一个1(1在奇数位置),并且1后面跟了偶数个0; 因此问题可以转化为判断1后面是否跟了偶数个0就可以了。4的整数次幂的二进制数都为 (4)100、(16)10000...

将4的幂次方写成二进制形式后,很容易就会发现有一个特点:二进制中只有一个1(1在奇数位置),并且1后面跟了偶数个0; 因此问题可以转化为判断1后面是否跟了偶数个0就可以了。
4的整数次幂的二进制数都为 (4)100、(16)10000、(64)1000000......
另外,4的幂次方4^n也可以写为2^(2*n),即也可以写为2的幂次方,当然就满足2的幂次方的条件了,即num & num-1==0。
思路:首先用条件num & num-1==0来判断是否为2的幂次方,若不满足,则不是。若满足,在用条件num & 0x55555555来判断,若为真,则这个整数是4的幂次方,否则不是。
使用递归来实现的代码如下:
代码如下:

#include "stdio.h"
#include "stdlib.h"
bool fn(unsigned int x)      //判断x是否是4的幂次方
{
  if ( x & (x - 1) )         //判断x是否为2的幂次方
   return false;
  return x & 0x55555555;     //判断1是否在奇数位置上
}
int log4(int value)      //递归判断一个数是4的多少次方
{
 if (value == 1)
  return 0;
 else
 {
  value>>=1;       //往右移位
  return 1+log4(value>>1);       //往右移位
 }
}
int main(void)
{
 int num;
 printf("请输入一个整数:");
 scanf("%d",&num);
 if(fn(num))     //使用与运算判断一个数是否是2的幂次方
  printf("%d是4的%d次方!n",num,log4(num));
 else
  printf("%d不是4的幂次方!n",num);
 system("pause");
 return 0;
}

使用非递归来实现的代码如下:
代码如下:

#include "stdio.h"
#include "stdlib.h"
bool fn(unsigned int x)      //判断x是否是4的幂次方
{
  if ( x & (x - 1) )         //判断x是否为2的幂次方
   return false;
  return x & 0x55555555;     //判断1是否在奇数位置上
}
int log4(int value)   //非递归判断一个数是4的多少次方  
{
 int x=0;
 while(value>1)
 {
  value>>=1;      //往右移位
  value>>=1;
  x++;
 }
 return x;

int main(void)
{
 int num;
 printf("请输入一个整数:");
 scanf("%d",&num);
 if(fn(num))     //使用与运算判断一个数是否是2的幂次方
  printf("%d是4的%d次方!n",num,log4(num));
 else
  printf("%d不是4的幂次方!n",num);
 system("pause");
 return 0;
}


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ Vectors 成员 empty():判断Vector是否为空(返回true时为空)
  • linux->shell-> if 条件判断,关于软连接的判断!
  • javascript操作html复选框checkbox:如何判断复选框是否被选中
  • shell如何判断文件是否存在,如何判断变量是否为空
  • c语言判断某一年是否为闰年的各种实现程序代码
  • 怎么判断串口已经收到数据,并及时读出?怎么判断串口已经将写入的数据发送完毕?
  • java实现判断字符串是否全是数字的四种方法代码举例
  • 在判断自符是否等于**时,用equals(“**”),那么如果我想判断它的值是否>=2该用什么呢?
  • 我是学pb的,判断闰年的是isdate("2-28"),但在java里怎么判断呢?
  • linux 下的自解压文件是什么格式,如何判断文件是否为自解压c++或者脚本判断均可
  • mysql中如何判断当前是字符 mysql判断字段中有无汉字
  • 知道TCP/UDP的包头,如何判断其应用层协议类型,struct tcphdr和 struct udphdr结构中那个变量能判断应用层协议类型。
  • c#判断字符是否为中文的三种方法分享(正则表达式判断)
  • 如何判断在线用户,主要是如何判断用户关闭所有窗口(即他已经不在线了)?
  • 判断图片-判断位图是否是黑白图片的方法
  • JQuery 判断某个属性是否存在hasAttr用法
  • 请问如何判断一个文件夹是否存在
  • 判断文件格式的c库函数
  • sftp命令如何判断成功与否?
  • Shell条件判断疑问?
  • java判断远程服务器上的文件是否存在的方法


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3