数学背后获得一个字符Ascii代码

问题描述 投票:0回答:2

所以,基本上我正在做一些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());
javascript
2个回答
0
投票

关于ASCII

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

那么计算机如何存储角色呢?这就是ASCII(美国信息交换标准代码)的用武之地。

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

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

为什么-18

这是一个聪明(但令人困惑)的黑客,强制所有小写字母跟随它后面的字符。

因为strstr = str.trim().toLowerCase();行设为小写,所以str [i]现在只包含从97('a')到97 + 25 = 122('z')的值。现在18 = 122 (mod 26)122%26

这是必要的,以适应'z'需要转到'a'的事实,因为我们只有26个字符从'a'到'z'我们需要“环绕”(模数/ %

注意:

(97('a')-18)%26 = 1
(98('b')-18)%26 = 2
...
(122('z')-18)%26 = 0

因此,当您为每个数字添加97('a')时,您会得到'a' - >'b','b' - >'c',...,'z' - >'a的函数映射“


1
投票

事实:'a'的charCode是97,而(97 - 18)%26 == 1

以'b'为例,(98 - 18) % 26 == 2,所以改变之后,它的charCode等于97 + 2 == 99,变成'c'。此规则适用于所有'a-z'。

现在您应该看到模式。

测验:如果你想改变大写字母怎么办?你会选择什么作为这个案例的“神奇数字”?

© www.soinside.com 2019 - 2024. All rights reserved.