今天我们说一说ASCII码,从一道题目开始说起。
一、转换成小写字母
实现函数 ToLowerCase(),该函数接收一个字符串参数 str,并将该字符串中的大写字母转换成小写字母,之后返回新的字符串。
这道题目其实是非常简单的一个问题,具体细节就不多说了,直接上代码吧。
整段代码的关键之处就是c = (char)(c | 0x20);这里其实写c + 0x20也可以,因为大写字母和小写字母的ASCII码值相差32,即0x20。但是一个加法运算需要n步的异或运算、与运算、位移运算,而c | 0x20一步位运算就出来结果了。
下面我们看看为什么或上0x20就可以“等价”于加0x20呢。
我们看到A和a的ASCII码值差别就是第6位的1的差别,所以'A' | 0x20 = 'a'这个公式就很好理解了吧!
同样,我们想一下小写字母转大写怎么操作呢?我们只需要把第6位的1变成0即可,其他位不变。同样的思路,如下。
0xDF = ~0x20,实际上为了代码可读性更高,小写转大写可以写成
c = c & (~0x20)
如果为了效率,加上注释,写成
c = c & 0xDF
也是可以的。
所以我们想一下,前人设计ASCII码表的时候,确实用了不少心思。据说我们现在用的ASCII码表是用了将近10年时间才定制下来的,是不是设计的很精妙?
二、加法运算
到这,肯定有读者肯定还在想加法运算为什么会有那么多步才能算完,那么就简单说一下计算机的加法运算。
我们先上一张数字逻辑图,下图是一个全加器的电路图。
其中,A、B是输入端,Cin是进位端;S是输出端,Cout是进位端。先简单介绍一下各个符号的含义。
表示的是Y= A ^ B (异或)
表示的是 Y = A & B (与)
表示的是 Y = A | B (或)
于是我们不难看出
S = A ^ B ^ Cin
Cout = (A ^ B ^ Cin) | (A & B)
S是不带进位的加法结果,Cout是进位。然后Cout左移一位再与S继续做加法即实现了一位加法的运算。
下面我们用代码实现一下加法(不用加号),代码如下:
计算加法,默认Cin为0(开始没有进位),然后直至算到进位为0,则输出sum。
当然,上面的代码只是用来描述上面的电路图,程序中计算加法不是上述代码过程,加法的运算是靠硬件实现的,上述代码只是简单示意加法的运算过程。
领取专属 10元无门槛券
私享最新 技术干货