Lower case to upper case – An interesting fact

1948 ワード

原文のウェブサイトは、完全に原文の翻訳ではなく、理解してから、自分の考えで説明します.
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コードでは、大文字と小文字はbit 5の違いしかないので、小文字でbit 5を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
  • には英語の文字列があり、この英語の文字列を上記の方法で小文字
  • に変更しました.
  • には英語の文字列があり、この英語の文字列を上記の方法で大文字と小文字に変換する
  • がある.
    Solution
    大文字を小文字に変換するには、大文字のbit 5を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);
            
    
        }