要理解这一点,我们必须查看字母的 ASCII 表示。在 base 2 中最容易做到这一点。
A 01000001 a 01100001
B 01000010 b 01100010
C 01000011 c 01100011
D 01000100 d 01100100
... ...
X 01011000 x 01111000
Y 01011001 y 01111001
Z 01011010 z 01111010
请注意,大写字母均以 开头010
,小写字母均以 开头011
。请注意,对于同一字母的大写和小写版本,低位都是相同的。
所以:将小写字母转换为相应的大写字母所需要做的就是将 更改011
为010
,或者换句话说,关闭该00100000
位。
现在,关闭位的标准方法是对掩码进行按位与运算,在要关闭的位的位置为 0,在其他任何位置为 1。所以我们想要的面具是11011111
. 我们可以把它写成,但是这个例子中的0xdf
程序员选择强调它是一个补充掩码。二进制的 32 是.00100000
~32
00100000
这种技术效果很好,除了它会对非字母做一些奇怪的事情。例如,它将'{'
变成'['
(因为它们分别具有 ASCII 代码01111011
和001011011
)。它会将星号'*'
变成换行符'\n'
(00101010
into 00001010
)。
在 ASCII 中将大写转换为小写的另一种方法是减去 32。这也将转换'a'
为'A'
(97 到 65,十进制),但 if 也会转换为,例如'A'
,'!'
。在这种情况下,按位与技术实际上是有利的,因为它转换'A'
为'A'
(这是转换为大写的例程应该做的)。
最重要的是,无论您使用 ~32 还是减去 32,在一个适当安全的函数中,您还必须检查被转换的字符是否是正确的字母开头。
此外,值得注意的是,该技术绝对假定为 7 位 ASCII 字符集,并且不适用于其他字符集的重音或非罗马字母,例如 ISO-8859 或 Unicode。(EBCDIC 将是另一回事。)