flag是啥?要如何使用?

flag可以講是種代表方法可以用來代表多種bool的值.就像馬路上的紅綠燈一樣.馬路上的紅綠燈會告訴你現在能否行駛.紅燈表示不能.綠燈表示可以.黃燈表示小心.一般來講若要寫個程式來代表紅綠燈的話.最簡單的寫法就是宣告3bool的變數叫做r(代表紅), g(代表綠), y(代表黃).r若是true的話那就表示紅燈亮了.r若是false的話那就表示紅燈沒亮.gy都是用一樣的原理.若這樣寫的話那會用到3bool.每個bool佔有4bytes.所以會用掉4*3=12bytes.

 

另一種寫法就是用flag.在電腦裡.一個int通常是4bytes.每個bytes裡總共有8bits.所以一個int裡總共有4*8=32bits.每個bit的值不是0就是1.bool的變數不是也只能有2個值?(truefalse).所以我們若以bit為單位的話那一個int裡不就可以容納32bool?對不對?也就是說每一個bit就代表一個flag.當那個bit裡的值是0時表示那個flagoff().當那個bit裡的值是1時表示那個flagon().

 

以下為一個int裡的每一個bit. (從右到左)

0x00000001    0x00000002    0x00000004    0x00000008

0x00000010    0x00000020    0x00000040    0x00000080

0x00000100    0x00000200    0x00000400    0x00000800

0x00001000    0x00002000    0x00004000    0x00008000

0x00010000    0x00020000    0x00040000    0x00080000

0x00100000    0x00200000    0x00400000    0x00800000

0x01000000    0x02000000    0x04000000    0x08000000

0x10000000    0x20000000    0x40000000    0x80000000

 

 

以紅綠燈為例.我們可以自己設定第一個bit代表紅.第一個bit代表綠.第一個bit代表黃.

#define     RED         0x00000001

#define     GREEN   0x00000002

#define     YELLOW        0x00000004

(我用#define, 但你可用const)

因我們的單位是bit.所以我們要用bit的運算子.在檢查這燈是否亮要用’&’.要設定此燈是否亮要用’|’.:

 

int lights; //lights代表整個紅綠燈.

 

lights = 0; //一開始所有的燈都不亮

lights = lights | RED; //亮紅燈.執行完此行.lights的值會變成1

lights = lights | GREEN; //亮綠燈.執行完此行.lights的值會變成3

lights = lights | YELLOW; //亮黃燈.執行完此行.lights的值會變成7

 

if (lights & RED) //檢查紅燈是否亮.lights的值是7.7裡有1所以紅燈有亮

    cout << “亮紅燈”;

if (lights & GREEN) //檢查綠燈是否亮.lights的值是7.7裡有2所以綠燈有亮

    cout << “亮綠燈”;

if (lights & YELLOW) //檢查黃燈是否亮.lights的值是7.7裡有4所以黃燈有亮

    cout << “亮黃燈”;

 

lights &= ~RED; //關紅燈.執行完此行.lights的值會變成6

lights &= ~GREEN; //關綠燈.執行完此行.lights的值會變成4

lights &= ~YELLOW; //關黃燈.執行完此行.lights的值會變成0

 

 

arrow
arrow
    全站熱搜

    deskwoodss 發表在 痞客邦 留言(0) 人氣()