JS 实现10进制转换36进制的示例代码
作者:YU_yu 发布时间:2024-04-28 09:50:01
前言
我们在平时写代码的时候偶尔会碰到进制转换的问题,常见的有2进制,8进制,10进制,16进制之间的转换,但是36进制却很少听过,这里就让我们用JS来简单尝试一下36进制的实现吧
思考
36进制数的构成
在开始前,我们需要先理清楚36进制的数字组成,这样我们才能对36进制数有一个清晰的认识以及后续对数字的转化。我们都知道,16进制数是由 0-9 以及a-f 之间的字符所构成,那么36进制呢?,将 a-f 继续后推20位,显而易见,它的字母部分正好由a-z 26个英文字母构成,所以36进制数是由 0-9,a-z 所组成的
数值准备
理清楚它的组成后,开始思考,一个10进制数经过怎样的转化可以成为一个36进制数呢? 我们需要先准备一个有36个数值的“仓库”数组,这个数组用来存放36进制数的所有数值,当10进制数需要进行进制转换的时候,根据数值进入这个仓库取出36进制数的值,在仓库中,0-9代表36进制数的0-9,10-35代表36进制数的a-z。代码如下
function getNums36() {
var nums36 = [];
for(var i = 0; i < 36 ; i++) {
if(i >= 0 && i <= 9) { // 存入0-9的数值
nums36.push(i)
} else { // 存入a-z的数值
nums36.push(String.fromCharCode(i + 87)); // ASCII码转换
}
}
console.log(nums36,'--------'); // 检查仓库的值
return nums36;
}
实现
仓库构建好后,我们开始分解进制转化的过程。
首先对传入的10进制数进行检测,先进行浮点数判断,由于这里不讨论浮点数的进制转换,所以直接返回。其次,进行负数的检测和处理,如果 n 为负数,调用Math.abs()方法将 n 转化为正数。
检测完成后,开始进行转换
设立一个while循环,while内部首先对 n 值做36的取余处理,得到 res ,
var res = n % 36;
这里是要获得这个10进制数转换为36进制数的最低位的值,将res抛入仓库中,取得36进制对应的数值,用unshift存入arr首位。
arr.unshift(nums36[res]);
最低位处理完后,我们需要对这个数进行进位,处理更高位数的值
n = parseInt(n/36);
至此,完成一轮循环
我们用while不断对 n 进行 res 的数值取余并不断进位,最后,可以将10进制数转化为36进制数
注意,此时记得将之前设置的neg的负数判断载首位加上
arr.unshift(neg)
最后,返回36进制数
return arr.join("");
代码
// 提供36位的表达 0-9 a-z
function getNums36() {
var nums36 = [];
for(var i = 0; i < 36 ; i++) {
if(i >= 0 && i <= 9) {
nums36.push(i)
} else {
nums36.push(String.fromCharCode(i + 87));
}
}
return nums36;
}
function scale36(n) {
// 单独的功能函数
// 16进制数: 0-9 a-f 36进制数: 0-9 a-z
const arr = [];
var nums36 = getNums36();
// 36 10
if(!Number.isInteger(n)){//浮点数判断,目前不支持小鼠
console.warn('不支持小数转换');
return n;
}
var neg = '';
if(n < 0){//对负数的处理
neg = '-';
n = Math.abs(n)
}
while(n) {
var res = n % 36;
console.log(res,'+++++++');
arr.unshift(nums36[res]);
// 进位
n = parseInt(n/36);
console.log(n,'---------');
}
arr.unshift(neg)
return arr.join("");
}
console.log(scale36(20)); // 10
扩展
7进制数的实现
这套模板同样适用于10进制对其他进制的转换,我们只需要修改一下仓库的数值,这里以一道LeetCode的7进制题目为例
504. 七进制数
给定一个整数,将其转化为7进制,并以字符串形式输出。
示例 1:
输入: 100 输出: "202"
先准备7进制数的数值仓库
function getNums7() {
var nums7 = [];
for(var i = 0; i < 7 ; i++) {
nums7.push(i)
}
return nums7;
}
再对取余的数值以及进位进行修改,就可以完成模板复用了
var res = n % 7;
n = parseInt(n/7);
代码
function getNums7() {
var nums7 = [];
for(var i = 0; i < 7 ; i++) {
nums7.push(i)
}
return nums7;
}
var convertToBase7 = function(num) {
// 单独的功能函数
const arr = [];
var nums7 = getNums7();
var neg = '';
if(num < 0){//对负数的处理
neg = '-';
num = Math.abs(num)
}
if(num == 0) {
return num + "";
}
while(num) {
var res = num % 7; // 对高位数据进行截取
arr.unshift(nums7[res]);
// 进位
num = parseInt(num/7);
}
arr.unshift(neg);
return arr.join("");
}
小结
从这个例子可以看出,只要稍加修改,我们就可以举一反三完成10进制对其他进制的随意转换,核心在于 res 的取余 以及 仓库数值的构建 ,我们通过不断进位和while循环,最终就可以拿到我们想要的进制数
来源:https://juejin.cn/post/6951938260021018632


猜你喜欢
- 写本篇文章之前其实也关注过vue中的一个关于加载动态组件is的API,最开始研究它只是用来实现一个tab切换的功能,使用起来也蛮不错的。is
- PHP chunk_split() 函数实例在每个字符后分割一次字符串,并在每个分割后添加 ".":<?php $
- 前言本文通过示例给大家详细介绍了关于python打印三角形的相关,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧1、直角三角
- 本文实例讲述了JS+CSS实现的日本门户网站经典选项卡导航效果。分享给大家供大家参考。具体如下:这里介绍的是来自日本门户网站的一款CSS+J
- MySQL会出现中文乱码的原因在于1.server本身设定问题,一般来说是latin12.建库建表时没有制定编码格式。MySql
- 引子:在windows中python3使用 pycryptodemo 模块实现Aes加密解密。Aes加密有多种方式,自己可以上网了解下。 A
- 一、概述全文索引在表中包括一个或多个基于字符的列。这些列可以具有以下任何数据类型:char、varchar、nchar、nvarchar、t
- 使用python实现双向循环链表,供大家参考,具体内容如下双向循环链表: 将所有的数据存放到节点中,每一个节点相连接,首尾链接,每一个节点中
- 1:UEditor-plus富文本编辑器如何在vue项目中使用备注:UEditor是由百度web前端研发部开发的所见即所得的开源富文本编辑器
- 本文主要介绍了vscode插件听网易云的实现,具体如下:当真正的听到了我本人的我喜欢的歌单里的歌时,惊呆了老铁,所以我此时此刻用激动的心颤抖
- 上python课程时需要设计一个系统,想着为系统加一个启动动画,所以做成了图片加进度条的形式。本文旨在用python实现无边框的进度条,并在
- 1、远程服务器上安装jupyter notebook(配置jupyter_notebook_config.py文件)sudo pip ins
- 1、作用删除指定长度的字符,并在指定的起点处插入另一组字符。2、语法STUFF ( character_expression , start
- 1、Python 有两种类型可以表示字符序列bytes:实例包含的是 原始数据 ,即 8 位的无符号值(通常按照 ASCII 编码 标准来显
- python 中的and从左到右计算表达式,若所有值均为真,则返回最后一个值,若存在假,返回第一个假值。or也是从左到有计算表达式,返回第一
- 今天老肥让我试试百度知道的新功能:插入地图。该功能需要登录才能操作,因此我意外的发现百度用户登录的弹出层变了。我很喜欢这个改进,利用TAB来
- 本文实例讲述了python实现的AES双向对称加密解密与用法。分享给大家供大家参考,具体如下:高级加密标准(Advanced Encrypt
- 基本介绍约束用于确保数据库的数据满足特定的商业规则在mysql中,约束包括:not null,unique,primary key,fore
- 本文为大家分享了pygame游戏之旅的第5篇,供大家参考,具体内容如下在游戏中添加显示文字:这里自己定义一个crash函数接口:def cr
- 提到分发请求,相信大多数人首先会想到Nginx,Nginx作为一种多功能服务器,不仅提供了反向代理隐藏主机ip的能力,还拥有简单的缓存加速功