算法题目

今天我们说一说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。

当然,上面的代码只是用来描述上面的电路图,程序中计算加法不是上述代码过程,加法的运算是靠硬件实现的,上述代码只是简单示意加法的运算过程。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180721G13MFU00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券