|簡體中文

比思論壇

 找回密碼
 按這成為會員
搜索



查看: 290|回復: 0
打印 上一主題 下一主題

C++ bit字段

[複製鏈接]

56

主題

0

好友

475

積分

中學生

Rank: 3Rank: 3

  • TA的每日心情

    2024-3-15 19:20
  • 簽到天數: 191 天

    [LV.7]常住居民III

    推廣值
    0
    貢獻值
    0
    金錢
    179
    威望
    475
    主題
    56
    樓主
    發表於 2014-7-18 20:45:16
    1. 位字段(bit field)是一个signed int或unsigned int中一组相邻的位(C99还允许_Bool类型位字段)。C使用unsigned int作为给位字段结构分配内存空间的基本单位。位字段由一个结构声明建立,该结构声明为每个字段提供标签,并决定字段的宽度。例如,以下声明建立了4个1位字段:
    struct {    unsinged int autfd : 1;    unsinged int autfc : 1;    unsinged int autfn : 1;    unsinged int autfs : 1;} prnt;
    该定义使prnt包含4个1位字段。现在,您可以使用普通的结构成员运算符将值赋给单独的字段:
    prnt.itals = 0;prnt.undln = 1;
    变量prnt被存储在一个int大小的存储单元中(虽然本例只使用了其中的4位)。

    2. 带有位字段结构的结构提供一种保存设置的方便的方法。有时,对于某个设置有两个以上的选择,因此您需要用多位来表示所有的选择。可以使用如下代码:
    struct {    unsigned int code1 : 2;    unsigned int code2 : 2;    unsigned int code3 : 8;} prcode;
    可以使用以下方法进行赋值:
    prcode.code1 = 0;prcode.code2 = 3;prcode.code3 =  102;
    如果所声明的总位数超过一个unsigned int大小,将会使用下一个unsigned int存储位置。而且,不允许一个字段跨越两个unsigned int之间的边界,编译器会自动地移位这样的字段定义,使字段按unsigned int边界对齐。这时,会留下一个未命名的若干位。

    3. 您可以使用未命名的字段主动制造出未命名位。使用一个宽度为0的未命名字段则会迫使下一个字段与下一个unsigned int对齐。例如:
    [url=][/url]
    [url=][/url]
    struct {    unsigned int filed1 : 1;    unsigned int        : 2; // 制造出一个2位的空洞    unsigned int filed2 : 1;    unsigned int        : 0; // 使下一字段偏移到下一个unsinged int位    unsigned int field3 : 3;} stuff;[url=][/url]
    [url=][/url]


    4. 字段放置到一个int中的顺序是依赖于机器实现的。因此,位字段往往难以移植。经典地,应该把它们用于不可移植的用途。

    5. 位字段中的字段不可取其地址。

    6. 可以使用与初始化普通的结构相同的语法来初始化一个位字段结构:
    [url=][/url]
    [url=][/url]
    struct box_props {    unsigned int opaque : 1;    unsigned int fill_color : 3;    unsigned int : 4;    unsigned int show_border : 1;    unsigned int border_color : 3;    unsigned int border_style : 2;    unsigned int : 1;}struct box_props box = {1, 1, 1, 2, 2};[url=][/url]
    [url=][/url]

    类似地,您可以为位字段成员赋值:
    box.fill_color = 0;
    还可以使用位字段成员作为switch语句的值表达式,也可以用作一个数组索引。

    重要聲明:本論壇是以即時上載留言的方式運作,比思論壇對所有留言的真實性、完整性及立場等,不負任何法律責任。而一切留言之言論只代表留言者個人意見,並非本網站之立場,讀者及用戶不應信賴內容,並應自行判斷內容之真實性。於有關情形下,讀者及用戶應尋求專業意見(如涉及醫療、法律或投資等問題)。 由於本論壇受到「即時上載留言」運作方式所規限,故不能完全監察所有留言,若讀者及用戶發現有留言出現問題,請聯絡我們比思論壇有權刪除任何留言及拒絕任何人士上載留言 (刪除前或不會作事先警告及通知 ),同時亦有不刪除留言的權利,如有任何爭議,管理員擁有最終的詮釋權。用戶切勿撰寫粗言穢語、誹謗、渲染色情暴力或人身攻擊的言論,敬請自律。本網站保留一切法律權利。

    手機版| 廣告聯繫

    GMT+8, 2024-6-1 10:49 , Processed in 0.020481 second(s), 26 queries , Gzip On.

    Powered by Discuz! X2.5

    © 2001-2012 Comsenz Inc.

    回頂部