大小写字符的转换
-
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 <stdio.h> int main() { char ch; printf("请输入一个字符:"); scanf("%c",&ch); printf("%c对应的大写字符是:",ch); ch = ch & 0xDF; printf("%c,小写字符是:",ch); ch = ch | 0x20; printf("%c\n",ch); return 0; }