php网站开发工程师教程,在线网站优化,网站做进一步优化,做职业测评的网站C语言判断一个数是否是2的幂次方或4的幂次方快速判断一个数是否是2的幂次方#xff0c;若是#xff0c;并判断出来是多少次方#xff01;将2的幂次方写成二进制形式后#xff0c;很容易就会发现有一个特点#xff1a;二进制中只有一个1#xff0c;并且1后面跟了n个0…C语言判断一个数是否是2的幂次方或4的幂次方快速判断一个数是否是2的幂次方若是并判断出来是多少次方将2的幂次方写成二进制形式后很容易就会发现有一个特点二进制中只有一个1并且1后面跟了n个0 因此问题可以转化为判断1后面是否跟了n个0就可以了。如果将这个数减去1后会发现仅有的那个1会变为0而原来的那n个0会变为1因此将原来的数与去减去1后的数字进行与运算后会发现为零。最快速的方法(number number - 1) 0原因因为2的N次方换算是二进制为10……0这样的形式(0除外)。与上自己-1的位数这们得到结果为0。例如。8的二进制为10008-177的二进制为111。两者相与的结果为0。计算如下1000 0111-------0000使用递归来实现的代码如下#include stdio.h#include stdlib.hint log2(int value) //递归判断一个数是2的多少次方{if (value 1)return 0;elsereturn 1log2(value1);}int main(void){int num;printf(请输入一个整数);scanf(%d,num);if(num(num-1)) //使用与运算判断一个数是否是2的幂次方printf(%d不是2的幂次方\n,num);elseprintf(%d是2的%d次方\n,num,log2(num));system(pause);return 0;}使用非递归来实现的代码如下#include stdio.h#include stdlib.hint log2(int value) //非递归判断一个数是2的多少次方{int x0;while(value1){value1;x;}return x;}int main(void){int num;printf(请输入一个整数);scanf(%d,num);if(num(num-1)) //使用与运算判断一个数是否是2的幂次方printf(%d不是2的幂次方\n,num);elseprintf(%d是2的%d次方\n,num,log2(num));system(pause);return 0;}扩展求一个数n的二进制中1的个数。非常巧妙地利用了一个性质nn(n-1) 能移除掉n的二进制中最右边的1的性质循环移除直到将1全部移除这种方法将问题的复杂度降低到只和1的个数有关系。代码如下int Func3(int data){ //利用了data(data-1)每次都能移除最右边的1移除了多少个1就是包含了几个1int count 0;while (data){data data (data-1);count;}return count;}扩展问题二A和B的二进制中有多少位不相同。这个问题可以分为两步(1)将A和B异或得到C即CA^B(2)计算C的二进制中有多少个1。快速判断一个数是否是4的幂次方若是并判断出来是多少次方将4的幂次方写成二进制形式后很容易就会发现有一个特点二进制中只有一个1(1在奇数位置)并且1后面跟了偶数个0 因此问题可以转化为判断1后面是否跟了偶数个0就可以了。4的整数次幂的二进制数都为 (4)100、(16)10000、(64)1000000......另外4的幂次方4^n也可以写为2^(2*n)即也可以写为2的幂次方当然就满足2的幂次方的条件了即num num-10。思路首先用条件num num-10来判断是否为2的幂次方若不满足则不是。若满足在用条件num 0x55555555来判断若为真则这个整数是4的幂次方否则不是。使用递归来实现的代码如下#include stdio.h#include stdlib.hbool 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{value1; //往右移位return 1log4(value1); //往右移位}}int main(void){int num;printf(请输入一个整数);scanf(%d,num);if(fn(num)) //使用与运算判断一个数是否是2的幂次方printf(%d是4的%d次方\n,num,log4(num));elseprintf(%d不是4的幂次方\n,num);system(pause);return 0;}使用非递归来实现的代码如下#include stdio.h#include stdlib.hbool fn(unsigned int x) //判断x是否是4的幂次方{if ( x (x - 1) ) //判断x是否为2的幂次方return false;return x 0x55555555; //判断1是否在奇数位置上}int log4(int value) //非递归判断一个数是4的多少次方{int x0;while(value1){value1; //往右移位value1;x;}return x;}int main(void){int num;printf(请输入一个整数);scanf(%d,num);if(fn(num)) //使用与运算判断一个数是否是2的幂次方printf(%d是4的%d次方\n,num,log4(num));elseprintf(%d不是4的幂次方\n,num);system(pause);return 0;}相关阅读:Ubuntu中为Android实现Application Frameworks层增加硬件访问服务实现类似facebook无刷新ajax更新利用JS来控制键盘的上下左右键(示例代码)处理jsp显示文字过长问题的解决方法jQuery Ajax 实例代码 ($.ajax、$.post、$.get)Javascript 完美运动框架(逐行分析代码让你轻松了运动的原理)Win10屏幕亮度怎么调Win10正式版调节屏幕亮度图文教程(最新)android中开启actionbar的两种方法Win8如何打开文件资源管理器中的文件夹选项功能SQL Server中的RAND函数的介绍和区间随机数值函数的实现极易被忽视的javascript面试题七问七答一个JavaScript的求爱小特效php根据日期显示所在星座的方法浅析echo(),print(),print_r(),return之间的区别