php判断给定的整数是否是2的幂_C++_C语言判断一个数是否是2的幂次方或4的幂次方,快速判断一个数是否是2的幂次 - phpStudy...

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的二进制为1000;8-1=7,7的二进制为111。两者相与的结果为0。计算如下:

1000

& 0111

-------

0000

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

#include "stdio.h"

#include "stdlib.h"

int log2(int value) //递归判断一个数是2的多少次方

{

if (value == 1)

return 0;

else

return 1+log2(value>>1);

}

int main(void)

{

int num;

printf("请输入一个整数:");

scanf("%d",&num);

if(num&(num-1)) //使用与运算判断一个数是否是2的幂次方

printf("%d不是2的幂次方!\n",num);

else

printf("%d是2的%d次方!\n",num,log2(num));

system("pause");

return 0;

}

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

#include "stdio.h"

#include "stdlib.h"

int log2(int value) //非递归判断一个数是2的多少次方

{

int x=0;

while(value>1)

{

value>>=1;

x++;

}

return x;

}

int main(void)

{

int num;

printf("请输入一个整数:");

scanf("%d",&num);

if(num&(num-1)) //使用与运算判断一个数是否是2的幂次方

printf("%d不是2的幂次方!\n",num);

else

printf("%d是2的%d次方!\n",num,log2(num));

system("pause");

return 0;

}

扩展:求一个数n的二进制中1的个数。

非常巧妙地利用了一个性质,n=n&(n-1) 能移除掉n的二进制中最右边的1的性质,循环移除,直到将1全部移除,这种方法将问题的复杂度降低到只和1的个数有关系。代码如下:

int Func3(int data)

{ //利用了data&(data-1)每次都能移除最右边的1,移除了多少个1,就是包含了几个1

int count = 0;

while (data)

{

data = data & (data-1);

count++;

}

return count;

}

扩展问题二:

A和B的二进制中有多少位不相同。这个问题可以分为两步,(1)将A和B异或得到C,即C=A^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-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;

}

相关阅读:

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之间的区别

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/534480.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 包编译安装mysql_CentOS7编译安装MySQL8.0.23和Python3.1.9

卸载mariadbrpm -qa | grep mariadbmariadb-libs-5.5.64-1.el7.x86_64yum remove mariadb-libs.x86_64 -y安装高版本GCC,解决编译中会遇到的GCC 5.3 or newer is required (-dumpversion says 4.8.5)cd /optyum install centos-release-scl -yyum install devtoolse…

python3.0下载用什么浏览器_无法让Python下载网页源代码:“不支持浏览器版本”...

查看您列出的url,我执行了以下操作:使用wget下载了页面将urllib与ipython一起使用并下载了页面使用chrome,只保存了url所有3个都给了我相同的结果文件(相同的大小,相同的内容)。在这可能是因为我没有登录,但我确实看到…

java线程堆栈_深入JVM剖析Java的线程堆栈

在这篇文章里我将教会你如何分析JVM的线程堆栈以及如何从堆栈信息中找出问题的根因。在我看来线程堆栈分析技术是Java EE产品支持工程师所必须掌握的一门技术。在线程堆栈中存储的信息,通常远超出你的想象,我们可以在工作中善加利用这些信息。我的目标是…

java 文件下载方法_【工具类】Java后台上传下载文件的几种方式

/*** 将本地照片上传至腾讯云服务上*/public void uploadImage(String localImagePath) throws Exception {// 1.将订单照片上传至腾讯地图众包侧提供的云服务上try {File imageFile new File(localImagePath);if (imageFile.exists()) {String url "http://" map…

java io流读取txt文件_Java使用IO流读取TXT文件

通过BufferedReader读取TXT文件window系统默认的编码是GBK,而IDE的编码多数为UTF-8,如果没有规定new InputStreamReader(new FileInputStream(file),“GBK”)为GBK会出现读取内容乱码。//文件路径String filePath"C:/Users/Admin/Desktop/products.…

c 调用java程序_C ++可以调用Java代码吗?

小编典典是的,您当然可以。这是一个例子:这是java文件:public class InvocationHelloWorld {public static void main(String[] args) {System.out.println("Hello, World!");System.out.println("Arguments sent to this pro…

java 大数类_Java大数类介绍

java能处理大数的类有两个高精度大整数BigInteger和高精度浮点数BigDecimal,这两个类位于java.math包内,要使用它们必须在类前面引用该包:importjava.math.BigInteger;和importjava.math.BigDecimal;或者importjava.math.*;以下从几个方面对B…

java 画树_java – 如何绘制代表连接节点图的树?

我想在Java GUI中显示树,但我不知道如何.树代表连接节点的图形,如下所示:我应该说我有自己的树类:public class BinaryTree{private BinaryNode root;public BinaryTree( ){root null;}public BinaryTree( Object rootItem ){root new BinaryNode( roo…

mysql 优化代码_MySQL Order by 语句优化代码详解

Order by语句是用来排序的,经常我们会使用到Order by来进行排序,下面我给大家来讲讲Order by用法与优化排序,有需要的同学可参考MySQL Order By keyword是用来给记录中的数据进行分类的。MySQL Order By Keyword根据关键词分类ORDER BY keywo…

java.lang.class_关于Java.lang.Class的一些疑问

User.class可以在编译时就确定下来Class的泛型,而new User().getClass()实际上是运行时才能确定下来实际是什么泛型。举个例子:public class User{}public class Student extends User{public static void main(String[] args) {User user1 new User();…

java文件 linux_Linux执行Java文件

最近学习shell脚本,写个简单java类让linux去执行java类没别的东西,就引了一个fastjson的jar,写了个main方法 序列化一个User对象 打印package com.lws.demo;import java.util.Date;import com.alibaba.fastjson.JSONObject;import com.lws.mo…

java 刽子手游戏_java基础(九):容器

集合的引入List (ArrayList LinkedList)Set (HashSet LinkedHashSet TreeSet )Map (HashMap LinkedHashMap TreeMap)CollectionsIterator使用泛型1.为什么使用集合而不是数组?集合和数组相似点都可以存储多个对象,对外作为一个整体存在数组的缺点长度必须…

java面试手写单链表_(转)面试大总结之一:Java搞定面试中的链表题目

packageLinkedListSummary;importjava.util.HashMap;importjava.util.Stack;/*** http://blog.csdn.net/luckyxiaoqiang/article/details/7393134 轻松搞定面试中的链表题目* http://www.cnblogs.com/jax/archive/2009/12/11/1621504.html 算法大全(1)单链表** 目录&#xff1a…

ccf认证俄罗斯方块java_CCF认证历年试题 - osc_h3robkrt的个人空间 - OSCHINA - 中文开源技术交流社区...

CCF认证历年试题不加索引整理会死星人orz第一题:CCF201712-1 最小差值(100分)CCF201703-1 分蛋糕(100分)CCF201612-1 中间数(100分)CCF201609-1 最大波动(100分)CCF201604-1 折点计数(100分)CCF201509-1 数列分段(100分)CCF201503-1 图像旋转(100分)CCF201412-1 门禁…

mysql 变量作表名查询_使用MySQL函数变量作为表名查询

我需要有一个表中增加一定的ID(如AUTO_INCREMENT)函数使用MySQL函数变量作为表名查询我有水木清华这样DELIMITER $$DROP FUNCTION IF EXISTS GetNextID$$CREATE FUNCTION GetNextID(tblName TEXT, increment INT)RETURNS INTDETERMINISTICBEGINDECLARE NextID INT;SELECT MAX(c…

java 签名 ecdsa_Java实现ECDSA签名算法

ECDSA签名算法package com.albedo.security;/*** DSA 加解密实现*/public class ECDSAUtils extends Base {//字符编码public static final String ALGORITHM "EC";public static final String SIGN_ALGORITHM "SHA1withECDSA";/*** ECDSA 验签** param …

java异常处理方式推荐做法_谈谈Java异常处理这件事儿

此文已由作者谢蕾授权网易云社区发布。欢迎访问网易云社区,了解更多网易技术产品运营经验。前言我们对于“异常处理”这个词并不陌生,众多框架和库在异常处理方面都提供了便利,但是对于何种处理才是最佳实践,也是众说纷纭。异常处…

as400和java的区别_文件传输协议和AS400

我目前收到以下错误:远程服务器返回错误:(501)参数或参数中的语法错误 .我已经检查了服务器并且文件确实存在,如果我打开命令提示符并键入以下代码它可以工作:ftpopen 192.168.1.2cd /Imagesget S12345.jpeg这是正常的&#xff0c…

java中同时两人提交数据_如何一起发送JSON请求和发布表单数据请求?

所以这是一个应该在POST请求中接受以下参数的API:token (as form data)apiKey (as form data){"notification": {"id": 1,"heading": "some heading","subheading": "some subheading","image&qu…

java 64内存不足_请教一个 Java 内存占用的问题

第 1 条附言 364 天前2020-03-04 01:08:55.525 [HikariPool-1 housekeeper] WARN c.z.hikari.pool.HikariPool - HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta1m5s643ms48?s450ns).2020-03-04 01:09:08.516 [task-11] ERROR o.s.s.s.TaskU…