Algorithms_入门基础_如何使用最高效的方式来判断一个数是否是2的N次方
文章目录
- Question
- Answer 1.0
- Answer 2.0 按位与运算 &
- 须知
- 十进制转二进制
- 八位二进制
- 按位与运算 &
Question
引入… 先看个阿里巴巴的面试题吧
如何使用最高效的方式来判断一个数是否是2的N次方? 先思考下哈
…
…
…
…
…
…
…
…
…
…
…
…
…
…
Answer 1.0
分析下:
2的N次方嘛 ,举个例子 2 4 8 16是 2的N次方, 6 , 10 不是2的N次方。
2的N次方 ====> 就可以看成 这个数是不是可以拆成 N个2相乘嘛
那根据这个思路的话 ,写个伪代码
while(n>1){n % 2 == 0 ---> 如果除以2不为0 ,肯定不是2的N次方 n = n / 2 ; ---> 继续除以2 (即我们上面说的拆成N个2),循环判断
}
分析好了,我们来用Java语言实现下
/*** @author 小工匠* @version v1.0* @create 2019-11-19 21:22* @motto show me the code ,change the word* @blog https://artisan.blog.csdn.net/* @description**/public class Test {/*** 思路:* 如果某个数除以2 不等于0 ,最起码已经不是2的倍数了,更不要是2的N次方了 ,* 比如 3 ,5 ,7这种数字* 利用该特性循环判断** @param args*/public static void main(String[] args) {int n = 6;// 原始数值int temp = n; // 临时变量while (temp > 1) {// while循环if (temp % 2 == 0) { // 判断是否是2的倍数temp = temp / 2; // 除以2 继续下一次的循环判断System.out.println(temp == 1 ? ("原始数值【" + n + "】是2的N次方") : ("分析中...." + temp));} else {// 不是2的倍数,肯定不是2的N次方了,直接break跳出循环System.out.println(n + "不是2的N次方");break;// 终止循环}}}
}
好了,算是实现了, 其实看看这个代码是比较挫的,有没有更好的思路呢 ?
提示一下: 按位与运算
Answer 2.0 按位与运算 &
为啥能想到这种思路,其实也是要靠积累的,对数字要有足够的敏感,看到某个十进制的数,可以马上想到对应的二进制数。
八位二进制嘛 ,为啥是8位,请移步下方的须知
我们来看下几个数字
2 ,4 ,8 ,16
我们来看下 2 ,4 ,8 ,16 这几个十进制的是 对应的 二进制 ,咋算的 请移步下方的须知
2 = 10 ---->补位凑成8位 -----> 00000010
4 = 100 ---->补位凑成8位 -----> 00000100
8= 1000 ---->补位凑成8位 -----> 00001000
16=10000 ---->补位凑成8位 -----> 00010000
接下来我们看下 比2 4 8 16 小1的十进制整数,对应的二进制
2 = 10 ---->补位凑成8位 -----> 00000010
1 = 01 ---->补位凑成8位 -----> 000000014 = 100 ---->补位凑成8位 -----> 00000100
3 = 011 ---->补位凑成8位 -----> 000000118 = 1000 ---->补位凑成8位 -----> 00001000
7 = 0111 ---->补位凑成8位 -----> 00000111 16 = 10000 ---->补位凑成8位 -----> 00010000
15 = 01111 ---->补位凑成8位 -----> 00001111
按二进制位进行“与”运算 ,只有两个数的二进制同时为1,结果才为1,否则为0。
我们看下上面的规律哈 n 和 n-1 这两个十进制的整数 ,按照二进制进行 按位与运算后,为0,那么这个n就是2的N次方。
伪代码如下
if((n & (n-1)) == 0)) -----> n 就是 2的次方
接下来我们用java实现以下
/*** @author 小工匠* @version v1.0* @create 2019-11-19 21:27* @motto show me the code ,change the word* @blog https://artisan.blog.csdn.net/* @description**/
public class TestA {/*** 思路:* 按位与运算 & , 两个数字按照二进制的形式进行"与"运算 ,如果结果为0 ,则是2的N次方* @param args*/public static void main(String[] args) {int n = 128 ;System.out.println((n&(n-1)) == 0 ? n + "是2的N次方" : n + "不是2的N次方");}
}
须知
十进制转二进制
十进制整数转换为二进制整数采用"除2取余,逆序排列"法。
具体做法:
用2整除十进制整数,可以得到一个商和余数;
再用2去除商,又会得到一个商和余数,如此进行,直到商为小于1时为止,
然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。
一图胜千言 ,来吧
八位二进制
我们常说 “八位二进制” ,到底是啥意思嘞 ?
说起二进制 ,其实就要从计算机的的组成-电子元件说起, 这些元件一般都是只有两种稳定的工作状态,用高、低两个电位表示“0”和“1”在物理上是最容易实现的。
那八位二进制又是什么妖魔鬼怪呢? 我们知道 电脑的最小存储单位是字节Byte ,即我们常说的大B, 一个字节, 是由八位二进制位组成的,就是这八位数字只是由“0”和“1”两个数字组成 ,比如 11111000,00000001,00000101等等。
八位二进制 就是一个字节(Byte)的大小。
1个英文字母、英文标点、半角数字 在计算机是以八位二进制数保存 就是一个字节大小,
1个汉字(包括中文标点 全角数字)就是2个字节 (十六位二进制)
1位二进制大小就是1bit ,就是我们说的 小b。
在计算机科学中,bit通常用于表示信息的最小单位,也可以被称作是二进制位。在计算机学科中,bit一般用0和1表示。Byte也就是人们常说的字节,通常由8个位(8bit)组成一个字节(1Byte)
比如我们常见的基本类型的取值范围
bit与Byte之间可以进行换算,具体的换算关系为:1Byte=8bit
在计算机网络或者是网络运营商中,一般而言,宽带速率的单位用bps(或b/s)表示;bps表示比特每秒即表示每秒钟传输多少位信息,是bit per second的缩写 小b 。 在实际所说的1M带宽的意思是1Mbps(是兆比特每秒Mbps不是兆字节每秒MBps)。
1B=8b 1B/s=8b/s(或1Bps=8bps)1KB=1024B 1KB/s=1024B/s1MB=1024KB 1MB/s=1024KB/s
规范提示:实际书写规范中B应表示Byte(字节),b应表示bit(比特),但在平时的实际书写中有的把bit和Byte都混写为b ,如把Mb/s和MB/s都混写为Mb/s,导致人们在实际计算中因单位的混淆而出错。切记注意!!!
按位与运算 &
定义: 参加运算的两个数,按二进制位进行“与”运算
运算规则:只有两个数的二进制同时为1,结果才为1,否则为0。
比如 0 & 0= 0 ,0 & 1= 0,1 & 0= 0, 1 & 1= 1。
举个例子 :
3 &5 即 00000011 & 00000101 = 00000001 ,所以 3 & 5的值为1。
Algorithms_入门基础_如何使用最高效的方式来判断一个数是否是2的N次方相关推荐
- Algorithms_入门基础_时间复杂度空间复杂度
文章目录 算法的基本特征 & 设计原则 基本特征 设计原则 评价算法的两个重要指标 时间复杂度 定义 表示方法 如何计算时间复杂度 几种常见的时间复杂度 如何分析时间复杂度 常数 O(1) 对 ...
- C语言入门基础_验证哥德巴赫猜想
哥德巴赫猜想:任何一个大于6的偶数,都由两个素数相加组成 一.程序设计思路: 任意输入一个大于6的偶数,打印出组成它的两个素数. 例如输入偶数n,使n = i + j,i与j均为素数. 可利用穷举法查 ...
- Matlab入门基础_三
绘图 %% 绘图 %{一.二维图形二维绘图的基本命令有plot,loglog,semilogx,semilogy 和polar.它们的使 用方法基本相同,其不同特点是在不同的坐标中绘制图形.plot ...
- Python入门基础篇 No.8 —— 时间的表示_unix时间点_毫秒_time模块
Python入门基础篇 No.8 -- 时间的表示_unix时间点_毫秒_time模块 文章目录 Python入门基础篇 No.8 -- 时间的表示_unix时间点_毫秒_time模块 前言 一.时间 ...
- java课后习题七解析_《Java基础入门》_课后习题解析.doc
<Java基础入门>_课后习题解析 <Java基础入门>课后习题 Java开发入门 一.填空题 1.Java的三大体系分别是_JavaSE_____._JavaEE_____. ...
- 负荷计算的时候assert失败_负荷计算的入门基础知识,小白入门必备!
负荷计算是电气设计人员必须掌握的一必修课,选导体.设备还有保护开关的选择,电网系统分析,都离不开负荷计算的内容,为此小编特意总结9个负荷计算的入门基础知识,分享给大家,希望能在工作和学习中作为一份参考 ...
- 电脑的基础知识_电脑入门基础知识
电脑入门基础知识 学习电脑应该先了解电脑的基本的组件,然后学习操作,包括键盘.鼠标的使用,能基本使用操作系统,再学习打字. 作为一个电脑小白,想要学习电脑,首先要知道如何操作,学习打字,接着就是熟练使 ...
- 匹配正则_程序员入门基础:python正则表达式贪婪匹配和非贪婪匹配
此文为python正则表达式的高阶入门,正则基础入门请参考程序员入门基础:python的正则表达式. 一.贪婪匹配和非贪婪匹配 举例说明概念: print('非贪婪匹配',re.search('el+ ...
- python 判断列表所有元素是否为某个值_这应该是最详细的Python入门基础语法总结!...
这应该是最详细的Python入门基础语法总结! 这应该是最详细的Python入门基础语法总结! 定义变量,使用变量 input 用户自己输入值 print 打印值 可以输出多个变量 %d|%s 用于输 ...
最新文章
- 【青少年编程竞赛交流】02月份微信图文索引
- WinForms项目升级.Net Core 3.0之后,没有WinForm设计器?
- electron知识点
- 了解招聘中的这些潜台词,找工作少走弯路
- FPGA 无解漏洞 “StarBleed”轰动一时,今天来扒一下技术细节!
- php 设置多个html条件_PHP-FPM是个啥
- Impala的安装(含使用CM安装 和 手动安装)(图文详解)
- 有关使用seajs和template模板的总结
- CPU+GPU异构集群搭建的总结说明
- 第2章-计算机组成原理之概述篇
- 看电视剧《包青天》笔记
- HDU 4415 Assassin’s Creed(贪心)
- Linux-Systemd
- 1688按关键词搜索
- 【数据结构】-哈夫曼树以及哈夫曼编码
- jQuery获取或设置元素的属性值
- python中break的用法
- html个人信息表制作(适合初学者)
- make clean与make distclean的区别
- 华为Fit AP 刷 Fat AP