聯(lián)合體union的每一位表示一個信息叫做聯(lián)合體位域
聯(lián)合體
聯(lián)合體也叫共用體,由不同的數(shù)據(jù)類型組成,其變量互斥,存儲方式是所有成員共用一個段內(nèi)存,共同體同一時刻只能保存一個成員的值,如果對新的成員賦值,就會將原來成員的值覆蓋掉。
結(jié)構(gòu)體
結(jié)構(gòu)體是把不同的數(shù)據(jù)組合存儲成一個整體,存儲方式是所有成員組合存儲,每個成員都分別占用一個內(nèi)存。
聯(lián)合體與結(jié)構(gòu)體的區(qū)別
- 內(nèi)存占用情況
- 結(jié)構(gòu)體的各個成員會占用不同的內(nèi)存,互相之間沒有影響
- 共用體的所有成員占用同一段內(nèi)存,修改一個成員會影響其余所有成員
- 內(nèi)存分配大小
- 結(jié)構(gòu)體內(nèi)存 >= 所有成員占用的內(nèi)存總和(成員之間可能會有縫隙)
- 共用體占用的內(nèi)存等于最大的成員占用的內(nèi)存
優(yōu)缺點:
優(yōu)點:
- 節(jié)省空間
- 位運算可以提高數(shù)據(jù)操作的效率
缺點:
- 包容性弱,成員之間會相互影響
簡單使用
需求: 需要記錄一個車子的行駛方向,
分析:
- 前后左右這四個方向如果分別使用bool值來存儲,那么需要4個字節(jié),總共是32個位
- 這四個方向是互斥的,也就是一個時刻只能存儲一個方位,所以可以用聯(lián)合體來表示
- 每一個值放在一個位上面,所以是4位,也就是0.5個字節(jié)(當(dāng)然最少也是1個字節(jié)),就比之前省了好多空間
定義屬性

屬性.png
定義聯(lián)合體

聯(lián)合體.png
解釋:
- union表示定義了一個聯(lián)合體
- char bits是我們真正使用的那一段內(nèi)存的表示。就是成員
- 這里聯(lián)合體的內(nèi)存是一個char表示的字節(jié)
- struct {}說明這個字節(jié)可以用來表示什么,每個類型用哪一位來表示
- front代表第一個位置,back代表第二個位置
- 后面的1表示占用1位
- 如果back寫的是2,則為0001 1111
- 這個是聯(lián)合體的名稱
聯(lián)合體的運算
先定義位運算的計算方式

計算方式.png
說明:
- 如果是向前,則將1左移0位,也就是0000 0001
- 如果是向后,則將1左移1位,也就是0000 0010
- 如果是向左,則將1左移2位,也就是0000 0100
- 如果是向右,則將1左移3位,也就是0000 1000
進(jìn)行位運算設(shè)置(用向前來舉例)

運算.png
說明:
- |=,是取非運算符,都為0時為0,否則為1
- LGDirectionFrontMask為0000 0001,所以可以將bits的其他位數(shù)都設(shè)置為0,只保留最后一位為1
- 這樣就可以讓他代表向前
使用

使用.png
說明:
- 可以通過LLDB來查看此時的位數(shù)上為0或1