日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

位段練習(xí)題二

 lchjczw 2013-01-05

假如 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)常使用的:   & | ^ >> <<

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多