大写字母ASCII码的二进制和16进制表示:
A -> 0100-0001 -> 41
Z -> 0101-1010 -> 5A
小写字母ASCII码的二进制和16进制表示:
a -> 0110-0001 -> 61
z -> 0111-1010 -> 7A
观察可以发现大写字母和小写字母二进制ASCII码的差别在从左数第三位,大写字母该位为0小写字母该位为1。可以利用这点完成字母的大小写的判定和转换,具体来说:
大小写判定:
//char ch;
bool is_lowercase = ch & 0x20;
检验代码:
#include<iostream>
using namespace std;
int main() {
char ch1 = 'a', ch2 = 'A';
bool is_lowercase = ch1 & 0x20;
is_lowercase ? printf("%c is lowercase.\n", ch1) : 0;
is_lowercase = ch2 & 0x20;
is_lowercase ? 0 : printf("%c is not lowercase.", ch2);
}
运行结果:
大小写转换:
//大写转小写,使用"或"运算符
ch |= 0b0010-0000;
ch |= 0x20;
//小写转大写,使用"与"运算符
ch &= 0b1101-1111;
ch &= 0xDF;
//大小写转换通用操作,使用"异或"运算符
ch ^= 0b0010-0000;
ch ^= 0x20;
关于异或运算的性质:
-
与0异或原位不变
-
与1异或原位变反(0变1,1变0)
检验代码:
#include<iostream>
using namespace std;
int main(){
char pos[26];
for (int i = 0; i != 26; ++i) {
pos[i] = 'a' + i;
cout << pos[i] << " ";
}
cout << endl;
for (auto ch : pos) {
cout << (ch ^= 0x20) << " ";
}
}
}
运行结果: