假如 dir 是一個(gè)結(jié)構(gòu)數(shù)組, 結(jié)構(gòu)的成員是名字,
地址和其它信息。假設(shè)名字是唯一的, 請(qǐng)編寫一個(gè)程序,
它檢索名字并給出相應(yīng)的信息。由于一個(gè)名字是一個(gè)字符數(shù)組,
故我們必須比較各個(gè)字母。一種簡(jiǎn)單的方法是逐一比較各個(gè)字母。然而,
也有更方便的方法。
位段的應(yīng)用要表示一個(gè)英文字母, 八位似乎太多了, 五位就足夠了,
請(qǐng)看下表。
'A'= 00000000
'B'= 00000001
'C'= 00000010
'D'= 00000011
'E'= 00000100
... ...
... ...
'Y'= 00011000
'Z'= 00011001 |
在大多的計(jì)算機(jī)中, 短整數(shù)為 16 位長(zhǎng)。因此,
你有辦法把三個(gè)英文字母壓縮在一個(gè)短整數(shù)中嗎? 為了簡(jiǎn)單起見(jiàn),
我們假設(shè)頭三個(gè)字母就是以區(qū)分一個(gè)名字了。
程序 |
struct
namecomp
{
unsigned a:5,b:5,c:5;
unsigned l:1;
};
....
int find(char name[], short len)
{
struct namecomp namecp;
namecp.a=name[0];
namecp.b=name[1];
namecp.c=name[2];
namecp.l=len;
for (i=0; dir[i].name[0]; i++)
if (dir[i].nc==namecp)
return(i);
return -1;
} |
這個(gè)程序使用位段實(shí)現(xiàn)了剛才敘述的想法。顯然,
dir[i].nc 的類型為 namecomp 類型, dir[i].name[] 為字符串類型。但是,
這個(gè)程序是錯(cuò)的。你知道錯(cuò)在哪里嗎?
語(yǔ)句 if (dir[i].nc==namecp) return(i);
出錯(cuò)了。
這里你可以看到一個(gè)正確的程序。
正確的程序 |
struct
compaux
{
unsigned a:5, b:5, c:5;
unsigned l:l;
};
union namecomp
{
struct compaux prote;
unsigned cmp;
};
struct
{
unsigned nc;
char address[20];
} dir[1000];
int find(char name[0], short len)
{
union namecomp namecp;
namecp.prote.a=name[0];
namecp.prote.b=name[1];
namecp.prote.c=name[2];
namecp.prote.l=len;
... ...
if (dir[i].nc==namecp.cmp) return i;
return -1;
} |
位運(yùn)算符也是經(jīng)常使用的: & | ^ >> <<
|