2024-03-10
注意力训练 toUpperCase
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 键短接到「不同的那个位」上,按下去的时候实际就做了位运算来实现转大小写了