gpt4 book ai didi

javascript - 有人可以解释这个基本转换代码吗

转载 作者:行者123 更新时间:2023-11-29 16:47:54 25 4
gpt4 key购买 nike

var ShortURL = new function() {

var _alphabet = '23456789bcdfghjkmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ-_',
_base = _alphabet.length;
this.encode = function(num) {
var str = '';
while (num > 0) {
str = _alphabet.charAt(num % _base) + str;
num = Math.floor(num / _base);
}
return str;
};

this.decode = function(str) {
var num = 0;
for (var i = 0; i < str.length; i++) {
num = num * _base + _alphabet.indexOf(str.charAt(i));
}
return num;
};

};

我理解编码是通过从十进制转换为自定义基数(在这种情况下为自定义字母/数字)来工作的

我不太确定解码是如何工作的。为什么我们要将base乘以当前数字然后加上字母表的位置数字?我知道要将 010 base 2 转换为十进制,我们会这样做

(2 * 0^2) + (2 * 1^1) + (2 * 0 ^ 0) = 2

不确定它在解码算法中是如何表示的

编辑:我自己的解码版

this.decode2 = function (str) {
var result = 0;
var position = str.length - 1;
var value;
for (var i = 0; i < str.length; i++) {
value = _alphabet.indexOf(str[i]);
result += value * Math.pow(_base, position--);
}
return result;
}

这就是我编写自己的解码版本的方式(就像我想在纸上转换它一样。我希望有人更详细地解释解码的第一个版本是如何工作的。仍然不明白为什么我们乘以 num * base并以 0 开始 num。

最佳答案

好的,376 作为 encode() 函数的 base-10 输出意味着什么?这意味着:

  • 1 * 100 +
  • 5 * 10 +
  • 4 * 1

为什么?因为在 encode() 中,您在每次迭代时都用基数。这意味着,隐含地,在早期迭代中被插入字符串的字符在每次循环中都获得了基数因子的重要性。

因此,decode() 函数在每次看到新字符时都会乘以 基数。这样,对于第一个数字之后的每个数字位置,第一个数字都乘以基数一次,其余数字依此类推。

请注意,在上面的解释中,154 来自 positions “alphabet”列表中的字符 376。这就是您的编码/解码机制的工作方式。如果您为 decode() 函数提供一个数字字符串,该字符串由试图生成正常的 base-10 数字的东西编码,那么您当然会得到一个奇怪的结果;这可能是显而易见的。

edit 进一步详细说明 decode() 函数:(暂时)忘掉特殊的基数和编码字母表。无论涉及的基础如何,该过程基本相同。那么,让我们看一下将以 10 为基数的数字字符串解释为数字的函数:

function decode10(str) {
var num = 0, zero = '0'.charCodeAt(0);
for (var i = 0; i < str.length; ++i) {
num = (num * 10) + (str[i] - zero);
}
return num;
}

累加器变量 num 首先初始化为 0,因为在检查输入数字字符串的任何字符之前,唯一有意义的值是 0。

然后该函数从左到右遍历输入字符串的每个字符。在每次迭代中,累加器乘以基数,并加上当前字符串位置的数字值。

如果输入字符串是“214”,那么,迭代将进行如下:

  • num 设置为 0
  • 第一次迭代:str[i]2,所以 (num * 10) + 22 >
  • 第二次迭代:str[i]1,所以 (num * 10) + 121
  • 第三次迭代:str[i]4,所以 (num * 10) + 4214

连续乘以 10 可以实现代码中调用 Math.pow() 的功能。请注意,2 乘以 10 两次,实际上是乘以 100。

原始代码中的 decode() 例程做同样的事情,只是不是通过简单的字符代码计算来获取数字的数值,而是在字母字符串中执行查找。

关于javascript - 有人可以解释这个基本转换代码吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38927213/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com