位運算與字母大小寫轉換
阿新 • • 發佈:2019-01-23
宣告:這些內容主要是面向C語言的初學者,尤其是正在學習C語言的學生。
在讀王爽老師的《組合語言》時,看到了用and 和or指令處理字母大小寫轉換的例子。and 和or是組合語言中按位與和按位或操作的指令,對應C語言中的&和|操作。本文把這個例子的C語言版在這裡重複一下,以便理解和擴充位運算的應用。
我們知道大小寫字母的ASCII碼值差32,因此我們通常採用直接加減32的方法來進行大小寫字母的轉換。如果要用位運算來操作,則必須先從大小寫字母的ASCII碼值的二進位制形式入手。下表列出了部分字母的大小寫的ASCII碼值的二進位制形式。
大寫 |
十六進位制 |
二進位制 |
小寫 |
十六進位制 |
二進位制 |
A |
41 |
01000001 |
a |
61 |
01100001 |
B |
42 |
01000010 |
b |
62 |
01100010 |
C |
43 |
01000011 |
c |
63 |
01100011 |
D |
44 |
01000100 |
d |
64 |
01100100 |
E |
45 |
01000101 |
e |
65 |
01100101 |
F |
46 |
01000110 |
f |
66 |
01100110 |
仔細觀察上表的兩列二進位制形式,可以發現這樣的規律:除第5位外(位數從0開始計算),大寫字母和小寫字母的其他各位都一樣,大寫字母的第5位為0,小寫字母的第5位為1。因此,對於一個字母,不管原來是大寫還是小寫,將其第5位置0,它就必將變成大寫字母;將其第5位置1,它就必將變成小寫字母。下面的程式將兩個大小寫混合的字串分別轉換為大寫和小寫字母串。
//用位運算實現大小寫字母轉換
#include "stdio.h"
int main()
{
int i=0;
char a[6]="BaSiC";
char b[6]="MinIX";
do
{
a[i] = a[i] & 0xDF; //將第5位置0
b[i] = b[i] | 0x20; //將第5位置1
i++;
}
while(i<5);
printf("a = %s\nb = %s\n",a,b);
}