文章目录

  • 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次方相关推荐

  1. Algorithms_入门基础_时间复杂度空间复杂度

    文章目录 算法的基本特征 & 设计原则 基本特征 设计原则 评价算法的两个重要指标 时间复杂度 定义 表示方法 如何计算时间复杂度 几种常见的时间复杂度 如何分析时间复杂度 常数 O(1) 对 ...

  2. C语言入门基础_验证哥德巴赫猜想

    哥德巴赫猜想:任何一个大于6的偶数,都由两个素数相加组成 一.程序设计思路: 任意输入一个大于6的偶数,打印出组成它的两个素数. 例如输入偶数n,使n = i + j,i与j均为素数. 可利用穷举法查 ...

  3. Matlab入门基础_三

    绘图 %% 绘图 %{一.二维图形二维绘图的基本命令有plot,loglog,semilogx,semilogy 和polar.它们的使 用方法基本相同,其不同特点是在不同的坐标中绘制图形.plot ...

  4. Python入门基础篇 No.8 —— 时间的表示_unix时间点_毫秒_time模块

    Python入门基础篇 No.8 -- 时间的表示_unix时间点_毫秒_time模块 文章目录 Python入门基础篇 No.8 -- 时间的表示_unix时间点_毫秒_time模块 前言 一.时间 ...

  5. java课后习题七解析_《Java基础入门》_课后习题解析.doc

    <Java基础入门>_课后习题解析 <Java基础入门>课后习题 Java开发入门 一.填空题 1.Java的三大体系分别是_JavaSE_____._JavaEE_____. ...

  6. 负荷计算的时候assert失败_负荷计算的入门基础知识,小白入门必备!

    负荷计算是电气设计人员必须掌握的一必修课,选导体.设备还有保护开关的选择,电网系统分析,都离不开负荷计算的内容,为此小编特意总结9个负荷计算的入门基础知识,分享给大家,希望能在工作和学习中作为一份参考 ...

  7. 电脑的基础知识_电脑入门基础知识

    电脑入门基础知识 学习电脑应该先了解电脑的基本的组件,然后学习操作,包括键盘.鼠标的使用,能基本使用操作系统,再学习打字. 作为一个电脑小白,想要学习电脑,首先要知道如何操作,学习打字,接着就是熟练使 ...

  8. 匹配正则_程序员入门基础:python正则表达式贪婪匹配和非贪婪匹配

    此文为python正则表达式的高阶入门,正则基础入门请参考程序员入门基础:python的正则表达式. 一.贪婪匹配和非贪婪匹配 举例说明概念: print('非贪婪匹配',re.search('el+ ...

  9. python 判断列表所有元素是否为某个值_这应该是最详细的Python入门基础语法总结!...

    这应该是最详细的Python入门基础语法总结! 这应该是最详细的Python入门基础语法总结! 定义变量,使用变量 input 用户自己输入值 print 打印值 可以输出多个变量 %d|%s 用于输 ...

最新文章

  1. 【青少年编程竞赛交流】02月份微信图文索引
  2. WinForms项目升级.Net Core 3.0之后,没有WinForm设计器?
  3. electron知识点
  4. 了解招聘中的这些潜台词,找工作少走弯路
  5. FPGA 无解漏洞 “StarBleed”轰动一时,今天来扒一下技术细节!
  6. php 设置多个html条件_PHP-FPM是个啥
  7. Impala的安装(含使用CM安装 和 手动安装)(图文详解)
  8. 有关使用seajs和template模板的总结
  9. CPU+GPU异构集群搭建的总结说明
  10. 第2章-计算机组成原理之概述篇
  11. 看电视剧《包青天》笔记
  12. HDU 4415 Assassin’s Creed(贪心)
  13. Linux-Systemd
  14. 1688按关键词搜索
  15. 【数据结构】-哈夫曼树以及哈夫曼编码
  16. jQuery获取或设置元素的属性值
  17. python中break的用法
  18. html个人信息表制作(适合初学者)
  19. make clean与make distclean的区别
  20. 华为Fit AP 刷 Fat AP

热门文章

  1. OpenMP入门教程
  2. tf.nn.conv2d 与tf.layers.conv2d的区别
  3. Python 位运算符号
  4. 怎么学python知乎_你们都是怎么学 Python 的?
  5. Leetcode 130. 被围绕的区域 (每日一题 20210720 同类型题)
  6. 找到二叉树中的最大搜索子树
  7. osmnx 应用 可视化两张图异同的点和边
  8. R语言应用实战-基于R的因子分析(以上市公司数据为例)
  9. tableau必知必会之妙用 Lookup 函数同时跨行跨列取数
  10. python 模块学习 hashlib