Lower case to upper case – An interesting fact

原文網址,並不是完全是原文的翻譯,而是瞭解之後,用自己的想法解釋一遍

Problem

有一個英文字串,請將這個字串變為大寫

Solution

一般我們的想法像這樣:

    char str[256] = "segmentfault";

    for(int i = 0 ; str[i] != '\0' ; i++){
        if('a' <= str[i] && str[i] <= 'z')
             str[i] = str[i] - 'a' + 'A';
    }

Discussion

我們先觀察一下大小寫ASCII碼的比較:

A->01000001    B->01000010    C->01000011    D->01000100
a->01100001    b->01100010    c->01100011    d->01100100

其實可以發現在ASCII碼,大小寫只有bit5的不同,所以只要小寫字母將bit5替換為0,就能轉為大寫字母.實作時只要將小寫字母和11011111做and運算即可得到大寫字母,以下為實作:

    char str[256] = "segmentfault";

    for(int i = 0 ; str[i] != '\0' ; i++){
        if('a' <= str[i] && str[i] <= 'z')
            str[i] = str[i] &~ (1 << 5);
    }

Exercise

  1. 有一個英文字串,將這個英文字串用上述方法改為小寫
  2. 有一個英文字串,將這個英文字串用上述的方法把此英文字串做大小寫轉換

Solution

將大寫字母轉為小寫字母只要將大寫字母的bit5替換為1即可,實作只要將大寫字母和00100000做or運算即可得到小寫字母,實作如下:

    char str[256] = "SEGMENTFAULT";

    for(int i = 0 ; str[i] != '\0' ; i++){
        if('A' <= str[i] && str[i] <= 'Z')
            str[i] = str[i] | (1 << 5);
    }

大小寫替換只要將前兩個想法加在一起即可:小寫字母和11011111做and運算即可得到大寫字母,大寫字母和00100000做or運算即可得到小寫字母,實作如下:

    char str[256] = "SegmentFault";

    for(int i = 0 ; str[i] != '\0' ; i++){

        if('a' <= str[i] && str[i] <= 'z')
            str[i] = str[i] & ~(1 << 5);

        else if('A' <= str[i] && str[i] <= 'Z')
            str[i] = str[i] | (1 << 5);


    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值