前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >用JavaScript实现正整数十进制转二进制

用JavaScript实现正整数十进制转二进制

作者头像
LamHo
发布于 2023-05-11 01:05:52
发布于 2023-05-11 01:05:52
1.1K00
代码可运行
举报
文章被收录于专栏:小前端看世界小前端看世界
运行总次数:0
代码可运行

前言

好久没有写文章了,心血来潮想写一下关于JavaScript去实现各种计算机进制转换的实现,从而加深对进制的知识有更深的认知。前端开发在日常的工作中,基本上很难遇到需要进行对我们常用的十进制做转换的需求,但是作为计算器原理重要的一部分,如果有时间不妨搞清楚,对日后阅读源码或者面试也是有帮助的。

十进制转二进制

十进制是我们常用的计数方式,如:1,5,9,10,100;而二进制是计算使用计算方式,二进制有0和1组成。例如我们用十进制表示10,那么对应的二进制 1010

可以查看基维百科了解各种进制的规则。

基维百科

简单实现正整数十进制转换二进制

十进制转换二进制是有一个公式的,大家可以记住这个公式。要转换的十进制数为除数2作为被除数,那么除数/被除数会得到余数。然后将余数按顺序保存,接着将继续除2,直到等于0,这时候我们得到一串由多次运算得出的余数组成的字符串,这个时候将余数翻转就得到除数对应的二进制数了。

上面的文字太多,可能比较绕,我们可以看看下面的这张图:

以十进制的123,转换为二进制的流程。

下面我们上代码,看看要如何去编写js代码去实现简单的十进制转二进制

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function DecimalToBinary(number) {
  let temp = number;
  let result = '';
  while (temp > 0) {
    console.log(`======${temp}=======`);
    const remainder = temp % 2; // 获取余
    temp = parseInt(temp / 2, 10); // 获取商
    console.log(`${temp} ${remainder}`);
    result = remainder + result; // 从前拼接字符
  }

  const nativeResult = number.toString(2);
  console.log('原生转换结果:', nativeResult);
  console.log('函数转换结果:', result);
  console.log('是否一致:', result === nativeResult);
}

DecimalToBinary(123);

我们看看输出结果:

使用toString和我们自己编写的函数转换结果进行对比一致,并且与上述的公式输出一致。

根据JavaScript规范,https://tc39.es/ecma262/multipage/ecmascript-data-types-and-values.html#sec-numeric-types-number-tostring;对边界加上判断:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function DecimalToBinary(number) {
  let result = '';
  // 非number抛出异常
  if (typeof number !== 'number') {
    throw TypeError('argument is not number');
  // NaN返回"NaN"
  } else if (number !== number) {
    result = 'NaN';
  // 0或-0直接返回
  } else if (number === 0 || number === -0) {
    result = number === 0 ? '0' : '-0';
  // 正负无穷大返回正负无穷大
  } else if (number === Infinity || number === -Infinity) {
    result = number === Infinity ? 'Infinity' : '-Infinity';
  } else {
    let temp = number;
    while (temp > 0) {
      console.log(`======${temp}=======`);
      const remainder = temp % 2; // 获取余
      temp = parseInt(temp / 2, 10); // 获取商
      console.log(`${temp} ${remainder}`);
      result = remainder + result;
    }
  }
  const nativeResult = number.toString(2);
  console.log('原生转换结果:', nativeResult);
  console.log('函数转换结果:', result);
  console.log('是否一致:', result === nativeResult);
}

DecimalToBinary(123);

在这个时候我们尝试给一个超大的数字,就会发现出问题。例如我们传入一个1000000000000000000000进行转换二进制,这个时候JavaScript会将我们的数字转换成科学计数法,会以1e+21来表示,这个时候运行代码会发现和原生的转换不一致。

这是因为在JavaScript中,数字长度超过21位时,将会自动将数字转换为科学计数法来表示。另外值得一提的是,在JavaScript中,当数字2的53次方时,数值将会失去精度,导致数字的值存在偏差。

所以在这个时候,我们需要修改一下我们的代码,要求传入的数字以字符串的形式传入,然后我们实现一个大数相除来得出最终的二进制数。

首先我们需要实现一个大数除法的函数,但是这个函数并不是完整去实现除法的计算,因为在十进制二进制的情况下,并不需要去计算小数点后面的结果,只需要知道整数余数即可,所以在进行大数相除的时候,当计算到需要小数点的时候,就可以停止了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function BigNumberDivision(divisor, dividend) {
  let startIndex = 0;
  let currdivisor = '';
  let result = '';
  let remainder;
  currdivisor += divisor[startIndex];

  while (currdivisor !== '') {
    // 转为数字进行运算;
    const numberCurrDivisor = +currdivisor;
    // 除数小于被除数时借位
    if (numberCurrDivisor < dividend) {
      // 当前计算的是0,不需要计算
      if (numberCurrDivisor === 0) {
        result += parseInt(currdivisor, 10);
      // 如果上一次的余数为0,并且当前被除数需要借位,那么补0到结果中
      } else if (remainder === 0) {
        result += '0';
      }

      startIndex += 1;
      if (divisor[startIndex]) {
        currdivisor += divisor[startIndex];
      } else {
        // 当没有的借位的情况下,并且当前result为空,将补0
        if (result === '') {
          result = '0';
          if (!remainder) {
            remainder = numberCurrDivisor % dividend;
          }
        }
        currdivisor = '';
      }
    } else {
      const quotient = numberCurrDivisor / dividend;
      remainder = numberCurrDivisor % dividend;
      result += parseInt(quotient, 10);
      // 如果能除尽
      if (remainder === 0) {
        // 是否已经是最后一个数,如果已经是最后一个数,那么currdivisor可以为空,退出循环
        if (startIndex >= divisor.length - 1) {
          currdivisor = '';
          // 不是最后一个数,将后一位数加入currdivisor,进入下一次循环
        } else {
          startIndex += 1;
          // 后一位是0不运算,直接计入结果,并进入下一轮
          currdivisor = divisor[startIndex];
        }
        // 不能除尽
      } else {
        currdivisor = remainder;
      }
    }
  }

  return {
    quotient: result,
    remainder: `${remainder}`,
  };
} 

BigNumberDivision函数最终返回一个整数商余数给到DecimalToBinary进行递归运算。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function DecimalToBinary(numberStr) {
  let result = '';

  if (typeof numberStr !== 'string' || !/^(-?\d+)(\.\d+)?$/.test(numberStr)) {
    throw TypeError('输入的参数必须为数字字符串!');
  } else if (numberStr === '0' || numberStr === '-0' || numberStr === 'Infinity' || numberStr === '-Infinity') {
    result = numberStr;
  } else {
    let temp = numberStr;
    while (temp !== '0') {
      console.log(`======${temp}=======`);
      const { quotient, remainder } = BigNumberDivision(temp, 2); // 获取余和商
      temp = quotient; // 获取商
      console.log(`${temp} ${remainder}`);
      result = remainder + result;
    }
  }
  const nativeResult = Number(numberStr).toString(2);
  console.log('原生转换结果:', nativeResult);
  console.log('函数转换结果:', result);
  console.log('是否一致:', result === nativeResult);
} 

最终看看运行效果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DecimalToBinary(`${Math.pow(2, 53)}`);

//原生转换结果: 100000000000000000000000000000000000000000000000000000
//函数转换结果: 100000000000000000000000000000000000000000000000000000
//是否一致: true

当传入超过JavaScript最长长度的数字时,原生转换会出现转换错误,但是DecimalToBinary依然能正确转换。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DecimalToBinary('9007199254740993');

//计算数字: 9007199254740993
//原生转换结果: 100000000000000000000000000000000000000000000000000000
//函数转换结果: 100000000000000000000000000000000000000000000000000001

DecimalToBinary('9007199254740994');

//计算数字: 9007199254740993
//原生转换结果: 100000000000000000000000000000000000000000000000000010
//函数转换结果: 100000000000000000000000000000000000000000000000000010

DecimalToBinary('9007199254740995');

//计算数字: 9007199254740993
//原生转换结果: 100000000000000000000000000000000000000000000000000100
//函数转换结果: 100000000000000000000000000000000000000000000000000011

以后有空再写十进制的浮点数负数二进制以及二进制转换为十进制的实现方式吧。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-05-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
2022年消费金融行业研究报告
消费金融,指为个人提供以消费为目的的贷款,额度一般在 20 万元以下。早期消费金融产品主要由商业银行及汽车金融公司提供,随着消费金融市场的发展,持牌消费金融机构及互联网机构逐渐加入竞争。
资产信息网
2022/03/28
1.4K0
2022年消费金融行业研究报告
2022年不良资产和资产管理公司行业研究报告
不良资产(Non-performing Assets)是一个比较宽泛的概念,它是针对会计科目里的坏账科目而言,包括但不限于银行的不良资产、政府的不良资产,以及证券、保险、基金、信托等的不良资产,企业的不良资产等等。金融企业尤其是银行作为风险行业,是不良资产的主要源头之一。
资产信息网
2022/03/23
2.2K0
2022年不良资产和资产管理公司行业研究报告
2022年金融租赁行业研究报告
金融租赁指由出租人根据承租人请求,按双方合同约定,从指定卖家购买承租人指定固定资产,在出租人拥有该固定资产所有权前提下,以承租人支付租金为条件,将一定时期该固定资产的占有、使用和收益权让渡给承租人。
资产信息网
2022/03/25
8560
2022年金融租赁行业研究报告
2021年资产管理行业发展研究报告
资产管理(Asset Management),通常是指一种“受人之托,代人理财”的信托业务。从这个意义上看,凡是主要从事此类业务的机构或组织都可以称为资产管理公司(Asset Management Companies),简称 AMC。
资产信息网
2022/04/20
1.4K0
2021年资产管理行业发展研究报告
2021年资产管理与托管银行行业发展研究报告
资产管理与托管银行是主要从事投资管理和与其相关的有偿托管和证券业务。包括经营共同基金和封闭式基金的公司以及单位信托公司。不包括那些主要从事商业贷款、投资银行业、经纪业和其它特殊金融业务的银行和金融机构。
资产信息网
2022/04/22
8000
2021年资产管理与托管银行行业发展研究报告
《大数据时代,全球征信业发展》研究报告
怎么理解征信? 征信的本质:对金融主体的数据刻画 征信是指对企业组织和个人的信用信息进行采集、整理、保存和加工,并向信息使用者提供的活动,其本质在于利用信用信息对金融主体进行数据刻画。 征信的功能:
数据猿
2018/04/19
2.9K0
《大数据时代,全球征信业发展》研究报告
2021年房地产金融行业发展研究报告
房地产金融是房地产业与金融业密切结合的产物。作为经济学的一个分支,主要研究房地产经济领域内信贷资金运动及其规律性。
资产信息网
2022/04/08
5770
2021年房地产金融行业发展研究报告
阿里小贷:封闭流程与数据挖掘
  随着新年后资金面的舒缓,货币基金收益率开始了持续的回落,货币基金投资方式的必然调整也加剧了风险收益比的不确定性。更为严峻的是明显的竞争加剧,随着一些大型商业银行让夺利益推出类似产品,始终无法进入线下支付的支付宝和财付通并不占优势。   支付清算是现代金融服务的大门,但如果马云所勾画的“外行对于内行的颠覆性领导”仅仅停留在这个层面,未免有些言过其实了。令我们欣喜的是,在大门的里面,互联网金融同样给传统银行们上了一课。并且相比于坐在顺风船上的余额宝,从尘埃中走出的阿里小贷更具有那么一丝超现实的意
大数据文摘
2018/05/21
9320
平安、宜信、飞贷,谁将称霸移动互联网贷款市场?
如果把2015年看做是我国个人征信市场化的元年,那在这个千亿级别的征信市场上,借贷成为了首当其冲的战场,无论是传统金融大佬平安、还是互联网巨头阿里、腾讯,抑或是创业新秀宜信、最大黑马飞贷都使出浑身解数,准备打一场持久战。但现实情况是虽然国家近一步放宽了借贷市场,借贷市场依然吃紧,再加上整个行业的残酷厮杀,无担保、无抵押依靠信用贷款的借贷模式到底能不能迎来爆发,又将面临着什么样的问题?
曾响铃
2018/08/20
9460
2021年券商行业发展研究报告
证券行业指专门从事有价证券买卖的法人企业。分为证券经营公司和证券登记公司。狭义的证券公司是指证券经营公司,是经主管机关批准并到有关工商行政管理局领取营业执照后专门经营证券业务的机构。它具有证券交易所的会员资格,可以承销发行、自营买卖或自营兼代理买卖证券。普通投资人的证券投资都要通过证券商来进行。
资产信息网
2022/04/15
5460
2021年券商行业发展研究报告
早报:中国网络直播用户规模年底将达3.92亿
1、新设网络小贷被叫停,真正持有网络小贷牌照的仅几十家机构 近日,设在央行的互联网金融风险专项整治工作领导小组办公室与设在银监会的P2P网贷风险专项整治工作领导小组办公室联合发布《关于规范整顿“现金贷”业务的通知》(以下简称《通知》)。随着政策落地,“现金贷”行业将迎大洗牌,上千家平台面临整顿清理。《通知》指出,具有无场景依托、无指定用途、无客户群体限定、无抵押等特征的“现金贷”业务快速发展,在满足部分群体正常消费信贷需求方面发挥了一定作用,但过度借贷、重复授信、不当催收、畸高利率、侵犯个人隐私等问题十分
用户1335017
2018/03/09
1.2K0
早报:中国网络直播用户规模年底将达3.92亿
关于Fintech的九个预言
摘要: 随着金融市场化和利率市场化的进程,国内的金融压抑减轻之后,金融创新的高潮可能会有回落,这是必然的,未来市场会进入更加理性、平稳的发展阶段。 ◆ ◆ ◆ 金融科技即为资产创新的一种 金融科技的出现和蓬勃发展,很大程度上是由时下的经济环境决定的。从信贷周期或流动性周期来看,金融的创新是有周期性的,创新最主要的动力就来自于资金的流动性过剩,资金的本质是追求高回报,因为近年来经济形势不好、以往资金获利的能力下降,所以解决资金回报问题的方法之一是资产创新。金融科技就是资产创新的一种。 在峰瑞资产创始合伙
大数据文摘
2018/05/24
4470
移动端借款比例上升 大数据和风控是关键
移动互联网的迅猛发展催生了更多创新和颠覆的模式,传统金融正受着巨大冲击。当前,随着微众银行微粒贷上线,加上现金贷、随意借、手机贷等平台,通过移动端贷款的平台也越来越多。 与此同时,以友信为代表的部分P2P平台也纷纷抢滩进入移动金融领域,“移动借款”正在从一个尚且新鲜的认知逐渐成为P2P行业的普遍共识。 对此,业内人士表示,通过移动端来贷款确实更加方便,不过可能更适合一些金额较小的贷款,同时,通过移动端等纯线上模式完成贷款,仍需依靠大数据的发展和不断完善征信体系。随着大数据、云计算等新一代互联网技术的迅速崛起
灯塔大数据
2018/04/10
1.1K0
BAT三巨头的互联网金融落子图
昨天百度宣布本月28日将推出类似余额宝的理财产品“百发”,其目标年化收益率可能达到8%。此举距离阿里彭蕾刚刚抨击完微信不过一周。百度、腾讯等互联网巨头,招行和平安等老牌金融机构、甚至游戏厂商巨人均尝试抢滩互联网金融这个时髦业务。 “互联网金融”与“金融互联网”最大的不同之处便在于“互联网”的属性。传统金融因财聚人,互联网金融因人聚财;传统金融以机构为中心,互联网金融用户为中心;传统金融牌照、资金为主,互联网金融技术和数据为主;传统金融产品是生硬的利率、收益率、年限方案,互联网金融通过互联网手
罗超频道
2018/04/27
1.1K0
2022年财务顾问FA行业研究报告
财务顾问(Financial Advisor, FA)又称融资顾问,这里主要是指帮助创业公司提供投融资服务的机构。FA本质上其实是介于创业者与投资机构之间的第三方,面向双方提供投融资的撮合服务,当然不仅限于私募融资服务,包括合并收购、战略重组、IPO、定向增发等方面不同机构都各有涉猎。在早期项目中,FA机构的佣金通常是融资金额的3%-5%,后期的项目融资金额较大,佣金比例也会适当调低。
资产信息网
2022/03/25
8060
2022年财务顾问FA行业研究报告
史上最全2017年百度贷款行业报告在这里!
数字是理性的,金融不总是理性的 金融,是人类自己制造的时光机。金融的初心,则是帮助人类突破约束条件,在不确定的未来中追求更大的自由。 古时的共享食物,今日的基金、股票、债券,都是一种金融安排,通过共担风险和共享利益,人类得以规模化地实现增长和繁荣。 金融拓展了人类计算未来的能力。特别是近两年,得益于政策支持,普惠金融站上了风口,使得原本没有机会享受金融服务的人群也能获得服务,其中的关键点和难点,是贷款的可获得性。 然而数字是理性的,金融不总是理性的。近两年信贷公司赴美上市潮引发各方争议,今时贷款有普惠金融的
用户1310347
2018/03/02
7980
史上最全2017年百度贷款行业报告在这里!
深度|新势能的缩影,消费金融爆发的这几年。
2009年7月,中国银监会发布《消费金融公司试点管理办法》,正式宣布启动消费金融试点工作。消费金融公司的角色定位是作为银行的创新及补充部分,发展商业银行动力不足的个人金融服务。因此,这一试点办法的下发及试点公司的批复可以被视为我国消费金融行业的开端。
用户1310347
2019/07/30
5110
深度|新势能的缩影,消费金融爆发的这几年。
2022年金融与互联网资质牌照研究报告
《国民经济行业分类》国家标准于1984年首次发布,分别于1994年和2002年进行修订,2011年第三次修订,2017年第四次修订。该标准(GB/T4754-2017)由国家统计局起草,国家质量监督检验检疫总局、国家标准化管理委员会批准发布,于2017年10月1日实施。
资产信息网
2022/03/25
2.1K0
2022年金融与互联网资质牌照研究报告
中国互联网银行深度研究报告:互联网+银行前景与数据分析
4. 互联网+银行:前途不可限量 4.1. 银行业的互联网渗透率仍处于低位 银行业资产规模基数庞大。2014 年银行业金融机构总资产规模达到 134.8 万亿元,商业银行净利润规模达到 1.55 万亿元,远超过保险、信托、基金等细分市场的总量。 互联网银行的渗透率仍处于低位。2013年被称为“互联网金融元年”,2013 年至今短短的两年多时间,互联网金融发展迅猛,尽管如此,与传统银行业庞大的体量相比较,互联网银行的渗透率仍处于低位,余额宝、P2P 等产品目前仅吸引了传统银行业未曾覆盖的长尾用户,尚未触及银行
CDA数据分析师
2018/02/11
1.7K0
微众微粒贷、蚂蚁借呗、京东金条,谁能赢得网贷下半场?
作为当前互联网金融市场最重要的分支之一,网络借贷已入“短、平、快、准”的移动互联网时代。不论是传统银行、消费金融公司还是BAT巨头、P2P等互联网金融平台,都在觊觎这一块大蛋糕。在经历了数年的快速成长后,网络信贷开始两极分化,并逐渐形成几超多强的局面,那么在网贷整体进入下半场的时候,谁才是决定生死的力量?谁又能打好风控这张牌?
曾响铃
2018/08/20
7660
推荐阅读
相关推荐
2022年消费金融行业研究报告
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档