1. 程式人生 > 其它 >C語言結構體的位段替代方法

C語言結構體的位段替代方法

技術標籤:C和指標c語言C和指標

【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)

這個問題算是前面位運算的一個應用,是嵌入式開發中很常見的操作,對應響應位的清空,賦值等操作必須掌握。