2016-11-17 1 views
-2

이 유형의 값을 저장하는 것이 처음입니다. 헤더 필드 값이 거의 없습니다. 2bit = 2, 1bit = 1, 1 비트 = 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 1 비트, two 2 비트, three 1 비트 및 four 4 비트 폭이다입니다. 2one에 할당되므로 & 1에 의해 0으로 처리됩니다.

당신이 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; 
관련 문제