自定义任意进制
2020-04-24 本文已影响0人
triplestudio
因为数字太长,想用更短的形式来表示,十六进制还不够,于是来个自定义转换。
分析归纳
对于 n 进制,表示满 n 进 1 位,如 9 + 1,在 10 进制里,满 10 了,就应该是进 1 位使用 10
表示了,而在 16 进制里,因为未满 16,仍在字符集的表示范围内,所以直接使用 A
表示。
- 二进制一个位从小到大是由二个字符组成的
01
- 十进制一个位从小到大是由十个字符组成的
0123456789
- 十六进制一个位从小到大是由十六个字符组成的
0123456789ABCDEF
由此:给定一个长度的字符集,即可进行类似的表示。
算法实现
基本思路:从个位向高位逐个得到该位的字符即可。
以下为 javascript
实现:
// num : 一个整数
// charSet : 一个字符集
function base(num, charSet){
// 个位以内,直接返回
if(num < charSet.length){
return charSet.substr(num, 1);
}
// 递归个位以上的部分
var high = Math.floor(num / charSet.length);
var unit = num % charSet.length;
return base(high, charSet) + charSet.substr(unit, 1);
}
// 以下调用输出 0 - 32 的16进制形式:
for(var i=0; i<=32; i++){
document.write(base(i, '0123456789ABCDEF') + ' ');
}
输出:0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20
以下为 php
的实现:
function base($num, $charSet){
// 个位以内,直接返回
if($num < strlen($charSet)){
return substr($charSet, $num, 1);
}
// 递归个位以上的部分
$high = floor($num / strlen($charSet));
$unit = $num % strlen($charSet);
return base($high, $charSet) . substr($charSet, $unit, 1);
}
echo base(?,'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ');
以上代码得到了 S6AG
,你知道是什么数字吗?