摄影:产品经理
与产品经理一起环游世界
例如,现在有一个仅由大小写英文字母组成的字符串。 现在我们要在大写和小写字母之间翻转并将其更改为。
也许您会使用以下解决方案:
dst = ''
src = 'xyzABCXYZabc'
for letter in src:
if letter.isupper():
dst += letter.lower()
else:
dst += letter.upper()
运行效果如下图所示:
那么有没有办法在不使用if条件的情况下翻转字母的大小写呢? 这时候我们就需要考虑字母的Ascii码了。
大写字母AZ对应的Ascii码为65~90,小写字母az对应的Ascii码为97~122。
我们看一下这些Ascii码对应的二进制值:
字母 Ascii 码二进制
65
97
66
98
...
...
...
90
122
如果你仔细观察,你会发现:与右边的第6位不同。 与右数第6个不同。 ...与只有右起第 6 位数字不同。
所以,如果你想把大写的A变成小写的a,只需要将右边第6位数字从0改为1即可。要将小写b变成大写B,只需要把右边第6位数字改为0。
总结一下,右起第6位如果从1变成0,就是小写,如果从0变成1,就是大写。 其他数字根本不需要改变。
如果不使用if判断,如何将1变成0,0变成1呢? 此时我们可以使用二进制异或运算:
1 xor 1 = 0
1 xor 0 = 1
0 xor 0 = 0
0 xor 1 = 1
异或运算,两边相同则返回0,两边不同则返回1。
因此,我们只需要将字母对应的Ascii码进行异或即可。
那么最终的代码就变成了:
dst = ''
src = 'xyzABCXYZabc'
for letter in src:
dst += chr(ord(letter) ^ 0b100000)
print(dst)
运行效果如下图所示:
上面的代码中,ord函数返回字符的Ascii码,chr函数将Ascii码转换为字符。