进制转换基础知识及方法230105

进制转换基础知识及方法

今天复习和深入了解了进制的转换的相关知识,突然想起有个博客,那就顺便记一下吧。

=====================================
8进制和16进制转2进制,以及2进制转8进制和16进制,都可以使用8421法快速得到转换后的结果,小数据和大数据都适合,口算都行。
例如: 16进制的 7c 转2进制

要凑的数8421说明
701117=4+2+1
c1100c=8+4

最终2进制结果为: 0111 1100

例如: 8进制的 62 转2进制

要凑的数421说明
61106=4+2
20102=2

最终2进制结果为: 110 010

总结:16进制转2进制用到的列为8421,而8进制转2进制用到的列为421

那么逆方向呢?2进制分别转8和16进制如何做?很简单,反过来即可。
例如: 2进制的 001 001 100 转8进制
(低位开始,三个为一组,不够就补零)

要凑的数421说明
001001=1
001001=1
100100=4

最终8进制结果为: 114 (上往下数)

例如: 2进制的 0111 1000 0101 转16进制
(低位开始,四个为一组,不够就补零)

要凑的数8421说明
011101117=4+2+1
100010008=8
010101015=4+1

最终16进制结果为: 785

再介绍一个两位数的8和16转10,以及10转8和16进制的方法,适合口算,如下

问:8进制的17对应的10进制应该是?
答:因为8进制是逢8进一,十位上的1表示进过了8,个位是7,所以8+7=15,对应的10进制是15。
同理,8进制的23对应10进制应该是,2*8+3=19。

问:16进制的3d对应的10进制应该是?
答:因为16进制是逢16进一,十位上的3表示进过了3个16,个位是d,d代表13,所以316+13=61,对应的10进制是61。
同理,16进制的2b对应10进制应该是,2
16+11=43。

问:10进制的34对应的8进制应该是?
答:因为8进制是逢8进一,因为34除8,所以商为4,余数为2,所以34/8=4—2,表示有4个8以及一个2,所以对应的8进制是42。
同理,10进制的56对应8进制应该是,56/8=7—0,结果是70。

问:10进制的83对应的16进制应该是?
答:因为16进制是逢16进一,因为83除16,所以商为5,余数为3,所以83/16=5—3,表示有5个16以及一个3,所以对应的16进制是53。
同理,10进制的97对应16进制应该是,97/16=6—1,结果是61。

总结:10进制转8和16进制,用的是除法(除去目标进制数得到商,搭配余数),而8和16转10进制,用的是乘法(十位乘,加个位)。

最后的最后,就是我自己用js实现的,任意进制转10进制,对应的10进制转任意进制。这个任意进制,只要符号个数满足,几百几千的进制都可以。
10进制转其他进制的原理用的是除法,除到商为0,倒序取余数。
其他进制转10进制的原理用的是那个乘法有幂运算的那个,最终结果相加即可。

附上我自己写的进制转换的JavaScript写法

u.shi2QiTaJinZhi = function (num, jz) {
    /*

console.log(Number.MAX_SAFE_INTEGER); // 9007199254740991 大于这个数将会出现错误,丢失精度
console.log(9007199254740991 === (9007199254740991+1), 5 === (5+1)); // false false
console.log(9007199254740992 === (9007199254740992+1), 5 === (5+1)); // true false 大于这个数将会出现错误
console.log(9007199254740990 === (9007199254740990+1), 5 === (5+1)); // false false

console.log(‘Number.MAX_VALUE=’,Number.MAX_VALUE); // 最大正数(取负数是是最小数) 返回科学计数法 1.7976931348623157e+308
console.log(‘Number.MAX_VALUE=’,Number.MIN_VALUE); // 最小正数 返回科学计数法 5e-324
*/
var aa = ‘abcdefghijklmnopqrstuvwxyz’.split(‘’);
//var aa = ‘甲乙丙丁戊己庚辛壬癸子丑寅卯辰巳午未申酉戌亥乾兑离震巽坎艮坤’.split(‘’);
console.log(‘查看支持的进制符号长度’, aa);
if(jz>aa.length+10) console.log(‘警告,最大进制不可超过’+(aa.length+10)+‘,最小不能小于2,否则可能出现不准确的情况’);
if (jz == 1) return;
if (!(/^\d+$/.test(num))) { console.log(‘警告,此十进制数 ’ + num + ’ 不是一个正整数(请勿包含空格) !’); return; }
if (num > Number.MAX_SAFE_INTEGER) { console.log(‘警告,此十进制数 ’ + num + ’ 已超过最大安全整数 ’ + Number.MAX_SAFE_INTEGER + ’ !’); return; }
var yu,shang,arr=[];
do{
yu = num%jz;
shang =parseInt( num/jz);
console.log(‘余数和商分别为:’,yu,shang);
num=shang;
arr.push(yu);
}while(shang>0)
arr.reverse();
var aa2=[10];
for(var i=1;i<aa.length;i++){
aa2[i]=aa2[i-1]+1;
}
console.log(‘查看字母aa:’,aa);
console.log(‘查看字母应该代表的数字aa2:’,aa2);
console.log(‘先模后除汇总的余数集合,arr:’,arr);
function arr_getIndex(val){
for(var i=0;i<aa2.length;i++){
if(aa2[i]==val) return i;
}
}
if(jz >= 11){
for(var i=0;i<arr.length;i++){
if(arr[i] >= 10){
var ind = arr_getIndex(arr[i]);
arr[i]=aa[ind]==undefined?‘空’:aa[ind];
}
}
}
console.log(‘处理转换为字母后的余数集合,arr:’,arr);
return arr.join(‘’);
}

u.qiTaJinZhi2Shi = function (num,jz){
	var aa='abcdefghijklmnopqrstuvwxyz'.split('');
	if(jz>aa.length+10) console.log('警告,最大进制不可超过'+(aa.length+10)+',最小不能小于2,否则可能出现不准确的情况');
	if(jz==1) return;
	var aa2=[10];
	for(var i=1;i<aa.length;i++){
		aa2[i]=aa2[i-1]+1;
	}
	function arr_getValue(val){
		for(var i=0;i<aa.length;i++){
			if(aa[i]==val) return aa2[i];
		}
	}
	var num_arr = (num+'').split('');
	num_arr.reverse();
	var sum=0, val=0;
	for(var i=0;i<num_arr.length;i++){
		if(isNaN(num_arr[i]) == true){
			val = arr_getValue(num_arr[i]);
			val = val == undefined?'0':val;
		}else val = parseInt(num_arr[i]);
		
		sum += val * Math.pow(jz, i);
		//console.log('val jz i 分别为:',val,jz,i);
	}
	return sum;
	/*
	十进制转任意进制,用取模取余的方法。任意进制转十进制就用幂的那个方法。再说明一个8421法,十六和八进制转二,二转八和十六进制,操作简单就是画个表就OK了,用惯了口算都行。另外口算两位数的8和16与10的互转也是没问题的,主要看各位的数值,具体看收藏的标签
	*/
}
/**
 * 获得指定范围的随机整数。返回包含最小值和最大值。
 * @param {int} min 最小值
 * @param {int} max 最大值
 */
u.funRandomNum = function (min, max) {
    var range = max - min;
    var rand = Math.random();
    var num = min + Math.round(rand * range);
    return num;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值