2016-11-17 22 views
-2

このタイプの値を保存するのは初めてです。ヘッダーフィールドの値はほとんどありません。 2bit = 2,1bit = 1,1 bit = 0,4bit = 13.どのようにしてuint8に順番に格納できますか?私を助けてください。2ビット、1ビット、1ビット、4ビットの値を1バイトの整数に格納する方法

#include <stdio.h> 
#include <stdint.h> 
#include <stdlib.h> 
#include <string.h> 

int main(void) { 
    uint8_t m; 
    uint8_t one, two, three, four; 
    one = 2; 
    two = 1; 
    three = 1; 
    four = 13; 

    // do not know how to store, 

    //assuming m is stored 
    one = (m >> 7) & 1; 
    two = (m >> 5) & 3; 
    three = (m >> 4) & 1; 
    four = m & 15; 
    printf("first %i , second %i, third %i, four %i", one, two, three, four); 
    return 0 
} 
+1

ます。http://www.catbを。 org/esr/structure-packing / – gj13

答えて

0

私はこの種のBitlayout(memorylayout)が便利だと思います。

typedef struct 
{ 
    UINT32 unOne  : 2; 
    UINT32 unTwo  : 1; 
    UINT32 unThree : 1; 
    UINT32 unFour : 4; 
} MType; 

...

MType  DummyMMsg; 

...

DummyMMsg.unOne = 2; 
DummyMMsg.unTwo = 1; 
DummyMMsg.unThree = 0; 
DummyMMsg.unFour = 13; 
1

あなたがすでにビットシフトを使用して格納された値を取得する方法を知っているようです。それを逆にして値を格納します。

m = ((one & 1) << 7) | ((two & 3) << 5) | ((three & 1) << 4) | (four & 15); 

このコードは、コードに基づいている:oneは、twoは2ビットであり、1ビットであるthreeは1ビットとfourは4ビット幅です。 2oneに割り当てられているため、& 1によってゼロとして処理されます。

あなたはtwooneと1ビットに2ビットを割り当てたい場合は、保存のためにこれを使用します。

m = ((one & 3) << 6) | ((two & 1) << 5) | ((three & 1) << 4) | (four & 15); 

、これを取得するために:

one = (m >> 6) & 3; 
two = (m >> 5) & 1; 
three = (m >> 4) & 1; 
four = m & 15; 
関連する問題