分享

位段练习题二

 lchjczw 2013-01-05

假如 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;
}


位运算符也是经常使用的:   & | ^ >> <<

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约