1. 程式人生 > >位運算與字母大小寫轉換

位運算與字母大小寫轉換

宣告:這些內容主要是面向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);
}