簡體   English   中英

如何將 c 中的整數位字段連接成 uint64_t 整數?

[英]How can I concatenate integer bit fields in c into a uint64_t integer?

我在 c 中有一個這樣的結構

struct RegisterStruct
{
    uint64_t b_0 : 64;
    uint64_t b_1 : 64;
    uint64_t c_0 : 64;
    uint64_t c_1 : 64;
    uint64_t c_2 : 64;
    uint64_t d_0 : 64;
    uint64_t d_1 : 64;
};

我想將字段連接成一個uint64_t整數。 每個字段應占用給定數量的位,定義如下:

b_0: 4bits 
b_1: 4bits
c_0: 8bits
c_1: 8bits
c_2: 8bits
d_1: 16bits
d_2: 16bits

結果應該是一個uint64_t整數,其中包含連接的位字段(從b_0d_2 ),每個字段占用給定的位數。

這是我嘗試過的,但我認為這個解決方案不正確:

struct RegisterStruct Register;

   Register.b_0 = 8;
   Register.b_1 = 8;
   Register.c_0 = 128;
   Register.c_1 = 128;
   Register.c_2 = 128;
   Register.d_0 = 32768;
   Register.d_1 = 32768;

   uint64_t reg_frame =Register.b_0<<60|Register.b_1<<56|Register.c_0<<48|Register.c_1<<40|Register.c_2<<32|Register.d_0<<16|Register.d_1;

您可以將包含位字段的結構與完整的 64 位無符號整數放在一個聯合中,如下所示:

union RegisterUnion
    struct
    {
        uint64_t b_0 : 4;
        uint64_t b_1 : 4;
        uint64_t c_0 : 8;
        uint64_t c_1 : 8;
        uint64_t c_2 : 8;
        uint64_t d_0 : 16;
        uint64_t d_1 : 16;
    };
    uint64_t val;
};

上面的主要問題是它不便攜 C 標准將位字段打包到其底層存儲單元類型(在本例中為uint64_t )的順序作為實現定義的決定。 這與多字節整數內的字節排序完全分開,即小端字節序與大端字節序。

此外,可能不支持使用uint64_t作為位字段的基本類型。 一個實現只需要支持_Boolsigned intunsigned int (或其限定版本)類型的位域成員。 根據C11 草案 6.7.2.1 第 5 段

  1. 位域的類型應為_Boolsigned intunsigned int或其他一些實現定義類型的限定或非限定版本。 是否允許原子類型是實現定義的。
typedef union
{ 
    struct
    {
        uint64_t b_0 : 4;
        uint64_t b_1 : 4;
        uint64_t c_0 : 8;
        uint64_t c_1 : 8;
        uint64_t c_2 : 8;
        uint64_t d_0 : 16;
        uint64_t d_1 : 16;
    };
    uint64_t u64;
}R_t;


int main()
{

    R_t Register;

    Register.b_0 = 8;
    Register.b_1 = 8;
    Register.c_0 = 128;
    Register.c_1 = 128;
    Register.c_2 = 128;
    Register.d_0 = 32768;
    Register.d_1 = 32768;

    printf("%llx\n", (long long unsigned)Register.u64);
}

https://godbolt.org/z/_dYuz2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM