假如 dir 是一个结构数组, 结构的成员是名字,
地址和其它信息。假设名字是唯一的, 请编写一个程序,
它检索名字并给出相应的信息。由于一个名字是一个字符数组,
故我们必须比较各个字母。一种简单的方法是逐一比较各个字母。然而,
也有更方便的方法。
位段的应用要表示一个英文字母, 八位似乎太多了, 五位就足够了,
请看下表。
'A'= 00000000
'B'= 00000001
'C'= 00000010
'D'= 00000011
'E'= 00000100
... ...
... ...
'Y'= 00011000
'Z'= 00011001 |
在大多的计算机中, 短整数为 16 位长。因此,
你有办法把三个英文字母压缩在一个短整数中吗? 为了简单起见,
我们假设头三个字母就是以区分一个名字了。
程序 |
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;
} |
这个程序使用位段实现了刚才叙述的想法。显然,
dir[i].nc 的类型为 namecomp 类型, dir[i].name[] 为字符串类型。但是,
这个程序是错的。你知道错在哪里吗?
语句 if (dir[i].nc==namecp) return(i);
出错了。
这里你可以看到一个正确的程序。
正确的程序 |
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;
} |
位运算符也是经常使用的: & | ^ >> <<
|