Indexes
实现一个
toUpperCase(str: string): string
要求能将 str 中出现的 a-z 字母转成大写形式,比如 '你好 hello'
变成 '你好 HELLO'
# 解析 ↵
也许可以这样,重复 26 次判断,或者弄一个 map 上去
00function charToUpperCase(ch: string): string | null { 01 if (ch === 'a') return 'A'; 02 // 重复 26 次 a-z 03 return null; 04}
但是注意到 'a' 和 'A' 的 ASCII 编码分别为 0x61 和 0x41, 展开来看其实只有 1 bit 的区别:
00'a' => 0x61 => 01100001 01 | 注意只有这一位不同 02'A' => 0x41 => 01000001
因此可以用位运算或者直接 +- 0x20 去优化了, 这里只贴一部分核心实现
00function charToUpperCase(ch: string): string | null { 01 const code = ch.charCodeAt(0); 02 if (code >= 0x41 && code <= 0x7a) { // a-z 03 return code & 0b11011111; 04 } 05 return null; 06}
应该是早期计算机大佬们在设计 ASCII 的时候就考虑到为了使用位运算而特意这样设计的编码规则。
此外,这种设计对于键盘的底层硬件实现也很友好,将 Shift 键短接到「不同的那个位」上,按下去的时候实际就做了位运算来实现转大小写了