Lower case to upper case – An interesting fact
原文のウェブサイトは、完全に原文の翻訳ではなく、理解してから、自分の考えで説明します.
Problem
英語の文字列があります.この文字列を大文字にしてください.
Solution
一般的に私たちの考えはこうです.
Discussion
まず、大文字と小文字のASCIIコードの比較を見てみましょう.
実はASCIIコードでは、大文字と小文字はbit 5の違いしかないので、小文字でbit 5を0に置き換えるだけで、大文字に変えることができる.実作時に小文字と11011111をand演算すれば大文字が得られ、以下は実作である.
Exerciseには英語の文字列があり、この英語の文字列を上記の方法で小文字 に変更しました.には英語の文字列があり、この英語の文字列を上記の方法で大文字と小文字に変換する がある.
Solution
大文字を小文字に変換するには、大文字のbit 5を1に置き換えるだけでよく、実作は大文字と00100000万をor演算するだけで小文字を得ることができ、実作は以下の通りである.
大文字と小文字を置き換えるには、小文字と11011111をand演算すると大文字、大文字と00100000をor演算すると小文字が得られ、実作は以下の通りです.
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);
}