ascii码表中大小写字母如下:
大写字母
10进制
二进制
小写字母
10进制
二进制
A
65
0100 0001
a
97
0110 0001
B
66
0100 0010
b
98
0110 0010
C
67
0100 0011
c
99
0110 0011
D
68
0100 0100
d
100
0110 0100
E
69
0100 0101
e
101
0110 0101
F
70
0100 0110
f
102
0110 0110
G
71
0100 0111
g
103
0110 0111
…
…
…
…
…
…
Z
90
0101 1010
z
122
0111 1010
结合上表,我们拿出任意一个字符, 假如是b;
那么 :
B(0100 0010)
b(0110 0010)
它们之间只有第六个二进制位的不同,在这里假设有
char ch1 = 'b'; char ch2 = 'B';
那么 ch1的二进制码就是 0110 0010,同理 ch2为0100 0010 那么对于语句
ch1 = ch1 & 0xDF ; // 0xDF = 二进制(1101 1111),其中0x在c语言中是16进制的标志,代表这个数是
ch2 = ch2 & 0xDF ; // 16进制数据,& 是按位与操作,就是将两个数的二进制码的每一位都进行 与 操作
那么 ch1、ch2 执行那条语句后的结果就是
(0110 0010) (0100 0010)
& (1101 1111) & (1101 1111)
--------------- --------------
(0100 0010) (0100 0010)
也就是 ch1 = (0100 0010),ch2 = (0100 0010),我们发现ch1、ch2代表的就是大写字符B的二进制码了。
也就是对任意字符ch执行
ch = ch & 0xDF;
那么ch就变成了ch字符对应的大写字符,类似,对任意字符ch执行
ch = ch | 0x20; // 0010 0000
那么ch就变成了对应字符的小写字符。具体分析过程,留给读者。
提示:对任意二进制码 0101 1001,假如我们要在第二位二进制位上存上一个1, 那么我们让其按位或上
0000 0010就行了,也就是 (0101 1001) | (0000 0010) = (0101 1001);因为 0 | 1(或者0) = 1(或0),而 1 | 1(或者0) = 1;
也就是按位或上0,原来的二进制位是没有变化的,但是按位或上1结果永远是1。
假如想把第4位的1变成0,那么(0101 1001) & (1111 0111) = (0101 0001);因为 1 & 1(或者0) = 1(或者0),
0 &1(或者0) = 0; 也就是按位与上1,原来的二进制位是没有变化的,但是按位与上0结果永远是0,这就是
计算机网络中利用网络掩码获取网络号的原理。
一个c语言小例子
#include
int main()
{
char ch;
printf("请输入一个字符:");
scanf("%c",&ch);
printf("%c对应的大写字符是:",ch);
ch = ch & 0xDF;
printf("%c,小写字符是:",ch);
ch = ch | 0x20;
printf("%cn",ch);
return 0;
}