原文網址,並不是完全是原文的翻譯,而是瞭解之後,用自己的想法解釋一遍
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
有一個英文字串,將這個英文字串用上述方法改為小寫
有一個英文字串,將這個英文字串用上述的方法把此英文字串做大小寫轉換
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);
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。