获得字符Ascii代码背后的数学

时间:2019-04-14 13:38:38

标签: javascript

因此,基本上,我正在做一些JS练习,并且我理解此代码,只是无法弄清楚在String.fromCharCode函数中获取字符Ascii代码背后的数学原理? 为什么我们减18?

让函件LetterChanges(str)接受要传递的str参数,并使用以下算法对其进行修改。将字符串中的每个字母替换为字母后面的字母(即c变成d,z变成a)。然后在此新字符串(a,e,i,o,u)中将每个元音大写,最后返回此修改后的字符串。

function LetterChanges(str) {

str = str.trim().toLowerCase();
var len = str.length;
var newStr = '';

for (var i = 0; i < len; i++) {
if (/[a-ce-gi-mo-su-y]/.test(str[i])) {
    newStr += String.fromCharCode(((str[i].charCodeAt(0) - 18) % 26) + 
97)    
}
else if (/[zdhnt]/.test(str[i])) {
    newStr += String.fromCharCode(((str[i].charCodeAt(0) - 18) % 26) + 
65);
}
else {
 newStr += str[i]; 
}
}
return newStr; 

}


LetterChanges(readline());

2 个答案:

答案 0 :(得分:1)

事实:“ a”的charCode为97,并且(97-18)%26 == 1

以'b'为例,例如(98 - 18) % 26 == 2,因此在更改后,其charCode等于97 + 2 == 99成为'c'。此规则适用于所有“ a-z”。

现在您应该看到模式了。

测验:如果要更改大写字母怎么办?在这种情况下,您会选择什么作为“魔术数字”?

答案 1 :(得分:0)

关于ASCII

众所周知,计算机不会将字符存储为“ a”,“ b”,“ z”或“。”,它们只接受二进制位(0或1)。这些二进制位可用于形成整数和数字,但不能形成字符串和字符。

那么计算机如何存储字符?这就是ASCII(美国信息交换标准代码)的出现。

因此,我们的想法是每个字符都需要存储为数字,然后,ASCII码是什么数字对应什么字符的标准,反之亦然。

所以要回答您的第一个问题: String.fromCharCode(x)只是返回标准化ASCII表中与数字x相对应的字符。例如,String.fromCharCode(65)将返回“ A”,因为“ A”的ASCII码已由标准标准化为65。

为什么要-18

这是一个聪明(但令人困惑)的技巧,可以将所有小写字母强加给它后面的字符。

由于str已由行str = str.trim().toLowerCase();变为小写,因此str [i]现在仅包含从97('a')到97 + 25 = 122('z' )。 现在18 = 122 (mod 26)122%26

这是必要的,以适应“ z”需要转到“ a”这一事实,并且由于我们只有26个字符从“ a”到“ z”,因此我们需要“环绕”(模数/ { {1}})

请注意:

%

因此,当您向每个数字加97('a')时,您将获得'a'->'b','b'->'c',...,'z'- >'a'