JS实现万能任意进制转换-进制上不封顶

2023-05-16

前端JS实现万能进制相互转换:N进制转M进制

Java版:https://blog.csdn.net/qiziyiming/article/details/83443771

 

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>万能进制相互转换</title>
</head>
<body>
<div>
	10进制输入测试:
	<input type="text" id="text1" />
	需要转的进制:<input type="text" id="va1" size="4" />
	位进制表示:<input type="text" id="va2" value="62"  size="4" />
	分隔符:<input type="text" id="va3" value="-"  size="4" />
	<input type="button" id="btn1" value="测试" onclick="setbtn1()"/>
	<br />
	N进制转10进制:
	<input type="text" id="text2" />
	现在的进制:<input type="text" id="va4"  size="4" />
	位进制表示:<input type="text" id="va5" value="62"  size="4" />
	分隔符:<input type="text" id="va6" value="-"  size="4" />
	<input type="button" id="btn1" value="测试" onclick="setbtn2()"/>
	
	<br />
</div>
<h1 id="a1"> </h1>
<h1 id="a2"> </h1>
<h1 id="a3"> </h1>
<h1 id="a4"> </h1>
<h1 id="a5"> </h1>
<h1 id="a6"> </h1>
</body>
</html>

<script type="text/livescript">

/**
 * 进制转换 <br>
 * 可以是绝对任意进制,,如果进制大于62进制,则必须使用其它进制表示一位, <br>
 * 比如256进制可以使用两个16进制表示一位(xx-xx-xx) <br>
 * 62进制中(Z~A:61~36;z~a:35~10;9~0)
 * 
 * @author Administrator
 * 
 */

/**
 * 62进制
 */
var bdm62 =[62];
/**
 * 一个62个字符,方便查询,0~9a~zA~Z <br>
 * 对应62进制
 */
var bdm62Str = "";
/**
 * 使最后输出double类型的值不以科学计数法输出
 */
function Hexadecimal() {
	/**
	 * 使最后输出double类型的值不以科学计数法输出
	 */
	for (var i = 0; i <= 9; i++) { /* 0~9 */
		bdm62[i] =String.fromCharCode((i + 48));
	}
	for (var i = 0; i < 26; i++) { /* a~z */
		bdm62[i + 10] =String.fromCharCode((i + 97));
	}
	for (var i = 0; i < 26; i++) { /* A~Z */
		bdm62[i + 36] =String.fromCharCode((i + 65));
	}
	for (var i = 0; i < bdm62.length; i++) {
		bdm62Str+=bdm62[i];
	}
}
function setbtn1(){
	var pow=document.getElementById("text1").value;
	var get=document.getElementById("va1").value;
	var pos=document.getElementById("va2").value;
	var sip=document.getElementById("va3").value;
	setval(pow,get,pos,sip);
}
function setbtn2(){
	var pow=document.getElementById("text2").value;
	var get=document.getElementById("va4").value;
	var pos=document.getElementById("va5").value;
	var st1=document.getElementById("va6").value;
	if(pow<2){
		return ;
	}
	if(get<2){
		get=16;
	}
	if(st1==null|st1==""){
		sip="-";
	}
	document.getElementById("a4").innerHTML=pow;
	/**
	 * N进制转10进制的反向操作
	 */
	var nto10 = getNto10_0(pow,st1,get ,pos );
	/**
	 * 输出N进制转10进制的最后结果
	 */
	document.getElementById("a5").innerHTML=nto10;
}
function setval(pow,get,pos,sip){
	if(pow<2){
		return ;
	}
	if(get<2){
		get=16;
	}
	if(sip==null|sip==""){
		sip="-";
	}
	
	var get10ToN ="";
	/**
	 * double不以科学计数法输出
	 */
	document.getElementById("a1").innerHTML=pow;
	/**
	 * 10进制转N进制
	 */
	get10ToN = get10ToN_10(pow,get,pos,sip,true);
	/**
	 * 输出10进制转N进制的最后字符串
	 */
	document.getElementById("a2").innerHTML=get10ToN;
	/**
	 * N进制转10进制的反向操作
	 */
	var nto10 = getNto10_0(get10ToN,sip, get, pos);
	/**
	 * 输出N进制转10进制的最后结果
	 */
	document.getElementById("a3").innerHTML=nto10;
}
/**
 * 测试
 */
function test() {
	/**
	 * 现进制或者需要进制
	 */
	var get=32;
	/**
	 * 进制位表示进制
	 */
	var pos=0;
	/**
	 * 幂运算
	 */
	var pow = Math.pow(255,13);
	setval(pow,get,pos,"-");
}

/**
 * @see #getNto10(String,String,var,var)
 * @param name {@link #getNto10(String, String, var, var)}
 * @param now  {@link #getNto10(String, String, var, var)}
 * @param pos  {@link #getNto10(String, String, var, var)}
 * @return
 * @throws Exception
 */
function getNto10(name, now, pos){
	return getNto10_0(name,"-",now,pos);
}
/**
 * N进制转10进制
 * 
 * @param name
 *            N进制表示信息<br>
 *            xxxnxnxnn(没有进制位,最大62进制Aa0)或者<br>
 *            xn-xn-xx-nn(每一位使用其它进制表示, <br>
 *            比如256进制可以使用两个16进制表示一位(xx-xx-xx))
 * @param nameSplit 分隔的字符
 * 
 * @param now
 *            现在的进制
 * @param pos
 *            进制位是多少进制表示,最大62(pos<2默认62)
 * @return
 */
function getNto10_0(name, nameSplit,  now,  pos){
	/**
	 * 判断最大位进制表示
	 */
	if (pos > 62) {
		pos = 62;
	} else if (pos < 2) {
		pos = 62;
	}
	/**
	 * 最后的计算的结果
	 */
	var m = 0;
	/**
	 * 如果现进制大于位进制
	 */
	if (now > pos) {
		/**
		 * 位进制的合理表示长度
		 */
		var k = 0;
		/**
		 * 使用对数计算最佳长度
		 * 例如256进制使用16进制表示,最多需要2位16进制表示一位
		 * 它们之间存在对数关系
		 */
		var lontem =lon(now,pos);
		k=lon;
		/**
		 * 如果存在小数
		 */
		if(lontem>k){
			k++;
		}
		/**
		 * 数组,把每阶的数转换成位进制后保存到数组中,然后再次进行阶运算
		 */
		var arrayList = new Array();
		var arrayList_i=0;
		
		/**
		 * 如果使用了分隔符
		 */
		if (name.indexOf(nameSplit) > 0||name.length<k) {
			var split = name.split(nameSplit);
			/**
			 * 先计算每组的10进制数
			 */
			for (var i = 0; i < split.length; i++) {
				/**
				 * 如果这一组长度不符合,则退出计算,返回错误提示
				 */
				if (split[i].length > k) {
							
					alert(name + "\t(" + split[i]
							+ ")格式错误,长度应为:" + k);
				}
				/**
				 * 递归调用,返回这一组的10进制数
				 */
				var setHdl10 = getNto10_0(split[i],nameSplit, pos, 0);
				/**
				 * 保持到数组
				 */
				arrayList[arrayList_i++]=(setHdl10);
			}
		} else {
			/**
			 * 没有使用分隔符,长度必须符合
			 */
			var i=0;
			while(true){
				/**
				 * 字符串截取,每次截取k个
				 */
				if(name.length>(i + 1) * k){
					var substring=name.substring(i * k, (i + 1) * k);
					var setHdl10 = getNto10(substring,nameSplit, pos, 0);
				arrayList[arrayList_i++]=(setHdl10);
				}else {
					/**
					 * 如果正好等于或者小于
					 */
					var substring=name.substring(i * k,name.length);
					var setHdl10 = getNto10(substring,nameSplit, pos, 0);
					arrayList[arrayList_i++]=(setHdl10);
					break ;
				}
				i++;
			}
		}
		/**
		 * 再把每组的10进制数据再做阶级计算
		 * 例:34567
		 * 7+0
		 * 7+0+6*10
		 * 7+0+6*10+5*100
		 * 7+0+6*10+5*100+4*1000
		 * 7+0+6*10+5*100+4*1000+3*10000=34567
		 */
		var length = arrayList.length - 1;
		for (var i = length; i >= 0; i--) {
			var double1 = arrayList[i];
			/**
			 * 幂运算
			 */
			var pow = Math.pow(now, length - i);
			m += double1 * pow;
		}
	} else {
		/**
		 * 先判断字符串是否符合当前进制规则
		 * 10进制:0~9
		 * 16进制:0~9a~f
		 */
		if (!getSpecial(name, now)) {
			var length = name.length - 1;
			/**
			 * 再阶级幂运算
			 * 例16进制:adb467
			 * 7+0
			 * 7+0+6*16
			 * 7+0+ 6*16+ 4*16*16
			 * 7+0+ 6*16+ 4*16*16+ 11[b]*16*16*16
			 * 7+0+ 6*16+ 4*16*16+ 11[b]*16*16*16+ 13[d]*16(4个)
			 * ......
			 */
			for (var i = length; i >= 0; i--) {
				/**
				 * 获取当前为字符
				 */
				var charAt = name.charAt(i);
				/**
				 * 查找字符的位置,它的位置正好是它表示的数值
				 */
				var indexOf = bdm62Str.indexOf(charAt);
				/**
				 * 阶级幂运算
				 */
				var pow = Math.pow(now, length - i);
				/**
				 * 如果当前为为0,则不需要
				 */
				if(indexOf>0){
					m += indexOf * pow;
				}
			}
		} else {
			alert(name + "不符合" + now + "进制:"
			+ bdm62Str.substring(0, now));
		}
	}
	return m;
}
/**
 * @see #get10ToN(double, double, double, String)
 * @param name
 * @param get
 * @param pos
 * @return
 * @throws Exception 
 */
function get10ToN(name,get,pos){
	return get10ToN_10(name, get, pos, null,true);
}
/**
 * N进制转换
 * @param name 数据
 * @param get N进制
 * @param pos 进制位表示
 * @param nameSplit 分隔符,空则不使用
 * @param isReverse 字符串是否倒序
 * @return
 * @throws Exception 
 */
function get10ToN_10(name,get,pos,nameSplit,isReverse) {
	
	var split = nameSplit==null||nameSplit=="";
	if(get>pos && split){
		alert("必须使用分隔符");
	}
	if(name<0){
		name*=-1;
	}
	/**
	 * 字符串累加
	 */
	var stringBuilder = "";
	/**
	 * 判断最大位进制表示
	 */
	if (pos > 62) {
		pos = 62;
	} else if (pos < 2) {
		pos = 62;
	}
	if(get>pos){
		/**
		 * 刚好是get进制的倍数
		 */
		var d = lon(name,get);
		if(Math.round(d)==d){
			for (var i = 0; i < d; i++) {
				stringBuilder+='0';
				stringBuilder+=nameSplit;
			}
			stringBuilder+='1';
		}else {
			/**
			 * 
			 */
			while (name>0) {
				/**
				 * 
				 */
				d = name%get;
				name-=d;
				if(d>0){
					/**
					 * 递归调用,计算表示进制
					 */
					var strTem = get10ToN_10(d, pos, pos, nameSplit,false);
					stringBuilder+=strTem;
					/**
					 * 后面还有数
					 */
					if(name>0){
						stringBuilder+=nameSplit;
					}
				}else {
					stringBuilder+='0';
					/**
					 * 后面还有数
					 */
					if(name>0){
						stringBuilder+=nameSplit;
					}
				}
				name/=get;
			}
		}
	}else {
		/**
		 * 刚好是get进制的倍数
		 */
		var d = lon(name,get);
		/**
		 * 取最近的整数比较
		 */
		if(Math.round(d)==d){
			for (var i = 0; i < d; i++) {
				stringBuilder+='0';
			}
			stringBuilder+='1';
		}else {
			/**
			 * 
			 * 不是进制的倍数
			 */
			while (name>0) {
				/**
				 * 例如时间毫秒值的计算:1000*60*60*10=10小时=3600000
				 * 3600000%1000							3600000%1000微秒
				 * (3600000-3600000%1000)/1000=3600		3600000%1000秒
				 * (3600-3600%60)/60=600				3600%60分
				 * (600-600%60)/60=10					小时
				 */
				d =name%get;
				name-=d;
				
				stringBuilder+=bdm62Str.charAt(d);
				name/=get;
			}
		}
	}
	if(isReverse){
		/**
		 * 倒序后,再返回最后的字符串,
		 */
		 var strtem="";
		for(var i=stringBuilder.length-1;i>=0;i--){
			strtem+=stringBuilder.charAt(i);
		}
		return strtem;
	}else {
		return stringBuilder;
	}
}
/**
 * 换底公式
 * @param value	对数
 * @param base 底数
 * @return
 */
function lon(value, base){
	return Math.log(value)/Math.log(base);
}
/**
 * 判断字符串是否符合K进制要求
 * 
 * @param name
 * @param k
 * @return
 */
function getSpecial(name, k){
	var substring = bdm62Str.substring(0, k);
	var matches =RegExp( "/^[" + substring + "]*$/");
	return getSpecial0(name, matches);
}

/**
 * 判断字符串是否符合规则
 * 
 * @param name
 *            字符串
 * @param matches
 *            正则表达式
 * 
 * @return
 */
function getSpecial0(name, matches) {
	return matches.test(name);
}
</script>

<script type="text/livescript">
	Hexadecimal();
	test();
</script>

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JS实现万能任意进制转换-进制上不封顶 的相关文章

  • 2014华为机试题目

    1 输入摸一个数 xff0c 然后将其倒过来相加 xff0c 如果和不是回文串 xff0c 那么将和再采取同样的操作 xff0c 在判断得到的是否为回文串 xff0c 这样往返7次 xff0c 如果其中有一次是回文就直接打出来 xff0c
  • 2014小米,百度,pptv,去哪儿笔试题目回忆

    今天一共笔试了这四家 xff0c 真累啊 xff0c 上午10点小米 xff0c 下午2点百度 xff0c 下午3点PPTV xff0c 下午5点去哪儿 xff0c 今天右手太酸了 xff0c 打的都话了50左右 xff0c 如果没面试通知
  • 质数因子

    功能 输入一个正整数 xff0c 按照从小到大的顺序输出它的所有质数的因子 xff08 如180的质数因子为2 2 3 3 5 xff09 思路 xff1a 传统的思维是从2到n遍历一遍 xff08 稍微优化一下可以到根号n xff09 x
  • OVS于DVS

    撰写时间 xff1a 2022 2 28 分布式虚拟交换机 xff08 DVS 注意 xff1a DVS是二层交换机 DVS特点 xff1a 1 集中管理 xff1a 通过统一的Portal页面进行集中管理 xff0c 简化用户配置 2 基
  • 如何同时使用maven-replacer-plugin和maven-assembly-plugin插件

    页面css和js缓存是前端常见的问题 xff0c maven有专门的插件maven assembly plugin可以处理 参考https blog csdn net weixin 34336292 article details 9197
  • Ubuntu上两台服务器利用nfs实现共享文件夹

    碰到的一个问题是 xff0c 一台服务器A放不下所有的数据 xff0c 部分数据只能放到另一台服务器B上 xff0c 那么就涉及到如何把服务器B上的数据共享给服务器A xff0c 使得A可以看到B上的内容 xff0c 需要用的是nfs文件共
  • Unbuntu16.04 虚拟机 安装win7以及文件共享

    KVM虚拟机的模版导出 xff0c 通常都是直接用qemu img命令可以将默认的raw格式或者qcow2格式的磁盘文件压缩后导出 xff0c 指令如下 xff1a 将默认raw格式的磁盘 xff0c 简单压缩转换成qcow2格式 qemu
  • 报错:RuntimeError: cuDNN error: CUDNN_STATUS_NOT_INITIALIZED

    一般显存溢出报out of memory之类 xff0c 修改了代码中batch size大小 xff08 忘记自己已经配置过默认参数 xff09 未解决 所以便认为是cuda配置问题 xff0c 多方检查确认cuda cudnn配置无误
  • js delete删除key

    var a 61 a a 61 1 a b 61 2 delete a 34 a 34 console log a b 2 delete a b console log a js 的delete可以根据key删除对象中的元素
  • 2014跌跌撞撞--伴我成长

    2014跌跌撞撞 伴我成长 上眼皮是正月 xff0c 下眼皮是腊月 xff0c 一转眼一年就过去了 没有轰轰烈烈 xff0c 也不是平淡无奇 xff0c 或许应该说是跌跌撞撞地走过来 叶子不断地从生命之树飘落 xff0c 不知不觉中岁月已在
  • stm32f103rb升级到stm32f103rc时代码移植注意事项

    1 由于stm32f103RC RD RE系列单片机芯片级的bug xff0c 代码中用到重映射相关函数的地方 xff0c 在其后面添加 HAL AFIO REMAP SWJ NOJTAG 语句 xff0c 如下所示 xff1a HAL A
  • OpenFlow所面临的挑战与创新方案

    1 OpenFlow控制面的挑战 2 OpenFlow转发面的挑战 3 芯片厂商的犹豫 一 OpenFlow控制面的挑战 OpenFlow在控制面存在以下不足 xff1a 1 master和slavecontroller的选举机制不够成熟
  • apt-get软件管理工具(软件安装、重装、卸载)

    apt get软件管理工具 下面讲解 xff0c linux系统下如何进行软件的管理 xff0c 包括软件的索引安装 更新 卸载删除 本地存储介中软件的安装 系统升级等操作 更多优质文章 xff0c 请访问博主个人网站 xff1a www
  • Ubuntu 系统下如何安装pip3工具

    一 导读 Ubuntu 系统内置了 Python2 和 Python3 两个版本的开发环境 xff0c 却没有内置相应的 pip3 管理工具 xff0c 本文将介绍如何在Ubuntu下如何快速安装 pip3 工具 xff0c 并升级到最新可
  • 包编译卡住的终极解决办法

    在数据库开发过程中 xff0c 经常遇到一个很烦躁的现象 xff1a 刚修改好的包一编译就卡死了 xff0c PL SQL变成一片空白 xff0c 又不忍心关闭 xff0c 这可是耗死多少脑细胞才写出来的 xff01 xff01 xff01
  • 正则表达式3,\A,\Z,\b,\B,\d,\D,\s,\S,\w.\W,re.compile

    1701H1 穆晨 180201 第114天总结 我爱学习 xff0c 学习使我快乐 A匹配输入字符串的开始位置 Z匹配输入字符串的结束位置 xff08 脱字符 xff09 匹配输入字符串的开始位置 xff0c 如果设置了re MULTIL
  • L1正则为什么更容易获得稀疏解

    L1和L2正则常被用来解决过拟合问题 而L1正则也常被用来进行特征选择 xff0c 主要原因在于L1正则化会使得较多的参数为0 xff0c 从而产生稀疏解 xff0c 将0对应的特征遗弃 xff0c 进而用来选择特征 但为什么L1正则会产生
  • VQA在CLEVR上的简单实现

    前言 Visual Question Answering是多模态学习的一个领域 xff0c 模型通过结合图像与问题 xff0c 推理出正确的答案 xff0c 由于问题问的是图像中出现物品的方位 xff0c 大小 xff0c 形状等等 xff
  • 对比学习损失篇,从L-softmax到AM-softmax到circle-loss到PCCL

    前言 对比学习是一种比较学习 xff0c 其主要目的为让模型学习到不同类别之间的特征 xff0c 其被广泛应用于人脸识别 xff0c 文本检索 xff0c 图像分类等领域 对比学习的主要思想是增大不同类别间的距离 xff0c 缩小相同类别间
  • 【ASP.NET】-Cookie、Session与Token机制

    前几天学习Session与cookie的时候想起来有一次技术分享时候 xff0c 提到了Token机制 xff0c 心里想着他们都是状态保持机制 xff0c 有什么关系和区别呢 xff0c 今天查了下简单有个认识 xff1b Cookie

随机推荐