ASCII简介及不经过比较转换字母大小写。

首先来看看ASCII码相关的概念:
计算机中,所有的信息都是二进制,但是我们所能理解的信息是具有约束意义的字符。比如说,看到“desk”,我们就知道指的是桌子,但是如何将desk这个信息存放在计算中呢?这里就需要对desk进行编码,将其转换为计算机可以存储的二进制信息。当我们需要查看存储的信息时,就需要对二进制解码。因此只要编码和解码的规则一致,我们就可以将我们理解的信息存储到计算机,或者从计算机中取出。
至于编码和解码的规则有很多,其中有一种方案是ASCII编码,也是当前计算机系统采用的方案。 ASCII 码使用指定的7 位或8 位 二进制数组合来表示128 或256 种可能的 字符。标准ASCII 码也叫基础ASCII码,使用7 位 二进制数来表示所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊 控制字符。这里我们只说基础ASCII码。
0~32以及127共34个是控制字符或者通信专用字符。比如:CR代表回车,FF代表换页,BS代表退格等。通信专用字符像ACK代表确认等。
33~126共95个是字符
  1. 48~57代表0~9十个阿拉伯数字
  2. 65~92:共26个大写英文字母
  3. 97~122共26个小写英文字母
剩下的便是一些标点符号,运算符号等。
当然我们注意到,一个ASCII码占用一个存储单元,也就是一个字节(8位),其中最高B7为用来做奇偶校验位。奇偶校验是指在代码传送过程中用来检验是否出现错误的一种方法,顾名思义分为奇校验和偶校验。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。比如说A的二进制:1100001。如果用奇校验,则B7应为0,即0110 0001.
详细见图:
ASCII码
键盘
ASCII 码
键盘
ASCII 码
键盘
ASCII 码
键盘
27
ESC
32
SPACE
33
!
34
"
35
#
36
$
37
%
38
&
39
'
40
(
41
)
42
*
43
+
44
'
45
-
46
.
47
/
48
0
49
1
50
2
51
3
52
4
53
5
54
6
55
7
56
8
57
9
58
:
59
;
60
<
61
=
62
>
63
?
64
@
65
A
66
B
67
C
68
D
69
E
70
F
71
G
72
H
73
I
74
J
75
K
76
L
77
M
78
N
79
O
80
P
81
Q
82
R
83
S
84
T
85
U
86
V
87
W
88
X
89
Y
90
Z
91
[
92
\
93
]
94
^
95
_
96
`
97
a
98
b
99
c
100
d
101
e
102
f
103
g
104
h
105
i
106
j
107
k
108
l
109
m
110
n
111
o
112
p
113
q
114
r
115
s
116
t
117
u
118
v
119
w
120
x
121
y
122
z
123
{
124
|
125
}
126
~

下面我们简单的认识一下编码和解码过程。
以文本编辑为例,在编辑过程中,当我们按下C键时,利用ASCII编码规则进行编码,转为十六进制的63H并存储在指定内存中,文本编辑器从内存中取出63H,送至显卡显存中,显卡来利用ASCII解码规则将63H在屏幕显示为C。

现在聊聊经常遇到的一道题目: 不使用比较转换字母大小写。
大写      十六进制         二进制            小写           十六进制        二进制
A          41                    0100 0001    a               61               0110 0001
B          42                    0100 0010    b               62               0110 0010
C          43                    0100 0011    c               63               0110 0011

对比发现,小写字符的ASCII的码值比大写字母大20H,同时大写字母二进制与小写字母二进制的区别在于第5为是0还是1(位数从0开始)。因此转换大小写思路有两种:
  1. 基于第一种比较的方式:首先判断是大写还是小写字母,然后加20H或者减20H
  2. 基于就修改二进制的方式:任何一个字母将第5位置1,则转成小写,置0则是大写。
现在我们用思路2来实现,代码如下:
#include 
using namespace std ;
void toUpper( char * ptr );
void toLower( char * ptr );
int main( int argc , char ** argv ){
                 char ptr [] = "ABCDabcd" ;
                 toUpper (ptr );
                 cout << ptr << endl ;

                 toLower (ptr );
                 cout << ptr << endl ;
                 system ("pause" );
}
/*
*小写转换成大写
*/
void toUpper( char * ptr ){
                 while (* ptr != '\0'){
                                 * ptr = (* ptr ) & 223 ; //与运算将第5位置0,223二进制1101 1111
                                 ++ ptr;
                 }
}
/*
*大写转小写
*/
void toLower( char * ptr ){
                 while (* ptr != '\0'){
                                 * ptr = (* ptr )|32 ; //或运算将第5位置1,32二进制0010 0000
                                 ++ ptr;
                 }
}


你可能感兴趣的:(白话算法)