题目描述:
假设有这么一个函数valueAtBit(num, bit),输入一个十进制数num,求它的二进制数的bit位是多少(注意bit应该从1算起)
以下是几种实现方法的总结:

方法一,最硬核的方法

这个方法模拟了平时我们计算二进制数的过程:

  1. num除以2,求出得商和余数(假设商为resu,余数为rest)
  2. 拿上次的商resu再除以2,求得新的商resu和本轮的余数rest
  3. 重复1、2步操作,直至商resu为0
  4. 倒序将所有的余数rest拼接即为该十进数的二进制表示

将上述过程实现成js代码如下:

function valueAtBit1(num, bit) { // 方法一var result = [];var rest = 0;var resu = num;while (resu != 0) {rest = resu % 2;resu = parseInt(resu / 2);  // 这里不要漏掉将小数转成整数result.push(rest);  // 这里的数组即为存储二进制数的各个位数(字符类型)}return result[bit - 1];  // 这里是应题目要求,求bit位的
}

方法二,使用js自带方法toString

function valueAtBit2(num, bit) { // 方法二var binary = num.toString(2);return binary[binary.length - bit];
}

toString接收一个参数radix(基数),表示你要把该数字对象(注意是数字对象才包含该方法,不可以是字面量)转成几进制的字符串。

方法三,使用移位操作

function valueAtBit3(num, bit) { // 方法三return num >> (bit - 1) & 1; //下面两种不可以, 因为只有与运算才能把除第一位以外的其他位“置零”.// return num >> (bit - 1) | 0;// return num >> (bit - 1) ^ 0;
}

这个方法是跳过求二进制数这个过程,直接求bit位的,因为移位操作只能是对二进制进行运算,所以这里可以直接用num,>>会隐式转换成二进制。
这个方法的原理是这样的:(不过如果大家看不懂以上的语句,建议在这之前先看一下位运算的基础知识哈)

  1. 先让所求位向右移到第一位,这时左边空出来的位会自动补0,先叫它“已移位的num”
  2. 让移位操作后的这个数和1相与(1的二进制除第一位左边全为0),这样相与了之后,得到的结果是除第一位之外的其他位都变为0,此时按照相与运算的运算规则:- 如果“已移位的num”第一位是0那么相与之后是0;- 如果“已移位的num”第一位是1那么相与之后是1。此时返回的结果便是所求。

可能我陈述得有点乱,不过大家可以亲测一下,原理很巧妙哦。

方法四,仅使用位相与操作

function valueAtBit4(num, bit) { // 方法四var binary = Math.pow(2, bit - 1);return (num & binary) == 0 ? 0 : 1; // ==比&优先级要高所以需要加括号
}

该方法与方法三有点相似,不过这个方法不需进行移位操作,而是先生造一个与所求位匹配的二进制数,让它们俩相与,如果结果为非零则返回1,结果为零则返回0
比如说要求29的二进制数的第3位,那么过程如下:

  1. 29 的二进制表示为 11101(这个过程由位操作符自动转换)
  2. 求第 3 位,那么生造一个二进制数 00100(除所求位为1,其他位为0),能达到这个效果的就需要用到Math.pow()这个方法了
  3. 让1、2步的这两个数进行位相与,结果是除所求位之外的其他位变为0,所求位如果原来是1则相与之后该位为1;,所求位如果原来是0则相与之后该位为0;(在本例中结果为 00100)
  4. 通过三元表达式判断结果并返回:判断第3步的结果是否为0,如果为零则返回0,如果非零则返回1(在本例中,结果00100即为十进制的4,非零,所以返回1)

我们可以验证一下结果,返回的1在原来的11101的第三位中确实是1,大家也可以验证看看其他位。原理也比较巧妙哦。
其中方法三和方法四学自牛客网的巨佬们,在这里要谢谢各位巨佬们。
同时也感谢读者们能读到最后,阿里嘎多~

关于“十进制转二进制,求位数”的一点小结相关推荐

  1. python 十进制转二进制,输出固定长度位数,带有都好格式的数据格式

    python 十进制转二进制,输出固定长度位数,带有都好格式的数据格式 from os import times #from typing import Protocol #from typing_e ...

  2. JS十进制转二进制(可控制位数)

    主要需求:十进制转二进制,可以控制指定的位数. 转化显示后的二进制数为bin-bit中输入的数字宽度. dec-number为5,bin-bit为5,则转化后数字为00101. 如果bin-bit小于 ...

  3. 十进制小数或带小数的十进制转二进制--控制小数位数输出(C语言)

    十进制小数或带小数的十进制转二进制: 十进制小数转换成二进制小数采用"乘2取整,顺序排列"法.具体做法是:用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数 部分 ...

  4. java 10进制转2进制递归算法_十进制转二进制

    十进制转二进制 JAVA实现 一.toBinaryString()方法 利用Java自己封装的转换二进制静态方法直接转换. public static void main(String[] args) ...

  5. C语言二位十进制计算器模数,十进制转二进制计算器

    win10系统之家今天精心准备的是<十进制转二进制计算器>,下面是详解! 怎样用电脑计算器计算二进制 用电脑计算器计算二进制的具体操作步骤如下: 1.首先在电脑桌面上点击左下角的" ...

  6. 数字计算机在线用,十进制与二进制在线转换工具

    APP说明 (1) 十进制转换为二进制,分为整数部分和小数部分 ① 整数部分 方法:除2取余法,即每次将整数部分除以2,余数为该位权上的数,而商继续除以2,余数又为上一个位权上的数,这个步骤一直持续下 ...

  7. 十进制转二进制,二进制转十进制的函数代码

    //十进制转二进制 func fuc(person:Int) { let a = String(person,radix:2) print(a) } fuc(person: 3) //二进制转十进制 ...

  8. Number - 十进制和二进制互相转换

    一 目录 不折腾的前端,和咸鱼有什么区别 目录 一 目录 二 前言 三 字符串求和/求差 四 十进制转二进制 五 二进制转十进制 六 总结 二 前言 在刷题的生涯中,你会碰到让你尴尬的一个问题: 十进 ...

  9. 计算机中十进制转二进制逻辑原理,.计算机中为什么要采用二进制?及二进制的基本运算规则,还有.二进制数据与十进制、八进制、十六进制数据之间的转换方法?...

    满意答案 sqq212527 2013.04.11 采纳率:46%    等级:12 已帮助:10556人 编辑本段简介 20世纪被称作第三次科技革命的重要标志之一的计算机的发明与应用,其运算模式正是 ...

最新文章

  1. git 获取最新代码_常用命令之git操作(入门篇)
  2. python中分支结构包括哪些_Python分支结构(switch)操作简介
  3. Jozky 刷题目录
  4. 【转】细说.NET 中的多线程 (一 概念)
  5. .依存句法分析--提取用户评论
  6. python分配 使最大的最小_python3中的heapq模块使用
  7. 《大数据》2021年第2期目次摘要
  8. Css+Div设置电脑端显示,手机端不显示代码
  9. 九九乘法表(Java)
  10. []TLD code run
  11. 原来 Python 还有这些实用的功能和特点!
  12. php 抽签,javascript随机抽签程序
  13. 和利时 浙大中控DCS组态软件,操作员在线模拟软件
  14. 计算几何(一) by 邓俊辉老师
  15. Linux中GoogleChrome谷歌浏览器安装好了打不开怎么办?
  16. cracker.jar 文件打不开
  17. 闲聊互联网经济的现代化
  18. C#实现毫秒级计时器
  19. Liferay URL
  20. 上网行为管理设备的介绍,部署与使用

热门文章

  1. linux找不到命令nginx,-bash: nginx: 未找到命令 (command not found) 解决方案
  2. foxmail自动接收邮件的时间设置
  3. 《人性的弱点》经典名句
  4. Qt 5.3.1 触摸笔无效 + Qt 5.6.2 编译出现错误:QtFontFamily::ensurePopulated(): PMingLiU
  5. asp执行cmd实例
  6. SSM计算机基础自学系统毕业设计-附源码221509
  7. 高手在民间!明知广告却让人欲罢不能的营销手段
  8. Win7+VS2010:mysql 源码编译与调试
  9. Notepad ++ 安装与配置
  10. 去除面部黑色素小妙招_怎么淡斑祛除脸部黑色素 5个小妙招有效淡斑美白