C語言結構體的位段替代方法
阿新 • • 發佈:2021-02-06
【10-11】如果不使用位段,你怎樣實現下面這段程式碼的功能?假定你使用的是一臺16位的機器,它從左向右為位段分配記憶體。
struct {
int a: 4;
int b: 8;
int c: 3;
int d: 1;
} x;
....
x.a = aaa;
x.b = bbb;
x.c = ccc;
x.d = ddd;
這個題目的思路很重要,特別是對嵌入式開發來講,在C語言中,不管是什麼結構,解析為記憶體地址對映後就比較好理解。
比如這個題目這個結構體變數x,它的記憶體結構如下所示:
共佔16位,裝置也是16位,所以可以宣告一個整數,用其高低位來儲存這個a、b、c、d的資料。它共佔16位,a、b、c、d幾個變數分別如上面各個顏色標示一樣。
- 賦值 x.a = aaa:
高位紅色位置等於aaa:(aaa & 0xf)得到紅色部分應該取的值,左移12位即到達高位紅色位置。
清空紅色部分的值:x &= 0x0fff
賦值: x |= (aaa & 0xf) << 12
- 賦值x.b = bbb:
綠色位置等於bbb,即 (bbb & 0xff)得到綠色部分應該取的值,左移4位即到達綠色位置。
清空綠色部分的值:x &= 0xf00f
賦值: x |= (bbb & 0xff) << 4
- 賦值x.c = ccc:
粉色位置等於ccc,即(ccc & 0x7)得到粉色部分應該取得值,左移一位即到達粉色位置。
清空粉色部分的值:x &= 0xfff1
賦值:x |= (ccc & 0x7) <<1
- 賦值x.d = ddd:
橙色位置等於ddd,即(ddd & 0x1)得到橙色部分應該取得值,無需左移。
清空橙色部分的值:x & 0xfffe
賦值:x |= (ddd & 0x1)
這個問題算是前面位運算的一個應用,是嵌入式開發中很常見的操作,對應響應位的清空,賦值等操作必須掌握。