2017-02-18 1 views
-5

현재 입력 파일에서 16 진수로 읽은 정수 값이 있습니다. 32 비트 비트 스트림을 조작하기 위해 세 부분으로 나누어야합니다. 원하는 출력 이하이다비트 문자열을 C에서 세 부분으로 나누기

원하는 출력 : 성이있어서

는, V 좌측 내 입력 값이, 다음의 X1과 X2 사이의 숫자이고, 제 X1 숫자이다되고 X2에서 끝까지의 자릿수 각 하위 섹션의 길이가 0보다 커야한다는 제한 사항이 있습니다. 이 어렵게 무엇

내가 X를 분할하고 위치가 다음을 분할 할 수있는 좋은 방법이 있나요 (X1 및 X2는 변경할 수 있습니다)

변화이다?

+1

적절한 수의 자리를 이동하고 결과를 원하는만큼 1 비트로 마스크하십시오. 예 : 'x & 7'은 비트 0-2,'x >> 4 & 15'를 가져와 비트 4 ~ 7을 얻습니다 ... – Ryan

+0

7을 얻은 곳에서 혼란스러워서 비트 0-2와 4-15의 결과를 얻습니다. 비트 4-7? –

+0

7 이진수는 111입니다. 15는 1111입니다. 0-2는 3 비트이고 4-7은 4 비트입니다. – Ryan

답변

0

여기서 기능은 splitter()입니다. 불행히도 많은 논쟁이 필요합니다. 분할 할 값 (value), 값의 최하위에있는 청크의 크기 (p1), 중간 청크의 크기 (p2), 높음, 보통 및 낮음 값에 대한 포인터 (hi_val , md_val, lo_val).

#include <assert.h> 
#include <inttypes.h> 
#include <stdio.h> 

static void splitter(uint32_t value, unsigned p1, unsigned p2, uint32_t *hi_val, uint32_t *md_val, uint32_t *lo_val) 
{ 
    assert(p1 + p2 < 32); 
    *lo_val = value & ((1U << p1) - 1); 
    value >>= p1; 
    *md_val = value & ((1U << p2) - 1); 
    value >>= p2; 
    *hi_val = value; 
} 

static void test_splitter(uint32_t value, int p1, int p2) 
{ 
    uint32_t hi_val; 
    uint32_t md_val; 
    uint32_t lo_val; 

    splitter(value, p1, p2, &hi_val, &md_val, &lo_val); 
    printf("0x%.8" PRIX32 " (%2u,%2u,%2u) = 0x%.4" PRIX32 " : 0x%.4" PRIX32 " : 0x%.4" PRIX32 "\n", 
      value, (32 - p1 - p2), p2, p1, hi_val, md_val, lo_val); 
} 

int main(void) 
{ 
    uint32_t value; 

    value = 0xFFFFFFFF; 
    test_splitter(value, 9, 11); 
    value = 0xFFF001FF; 
    test_splitter(value, 9, 11); 
    value = 0x000FFE00; 
    test_splitter(value, 9, 11); 

    value = 0xABCDEF01; 
    test_splitter(value, 10, 6); 
    test_splitter(value, 8, 8); 
    test_splitter(value, 13, 9); 
    test_splitter(value, 10, 8); 

    return 0; 
} 

test_splitter() 함수는 하나의 값이 플러스의 분할 될 섹션의 간단한 시험을 허용하고 main() 테스트 기능을 여러 번 호출한다.

출력은 다음과 같습니다

0xFFFFFFFF (12,11, 9) = 0x0FFF : 0x07FF : 0x01FF 
0xFFF001FF (12,11, 9) = 0x0FFF : 0x0000 : 0x01FF 
0x000FFE00 (12,11, 9) = 0x0000 : 0x07FF : 0x0000 
0xABCDEF01 (16, 6,10) = 0xABCD : 0x003B : 0x0301 
0xABCDEF01 (16, 8, 8) = 0xABCD : 0x00EF : 0x0001 
0xABCDEF01 (10, 9,13) = 0x02AF : 0x006F : 0x0F01 
0xABCDEF01 (14, 8,10) = 0x2AF3 : 0x007B : 0x0301 

섹션 중 하나가 디스플레이가 버릇 도착, 16보다 큰 경우 -하지만 그래도 코드가 작동합니다.

이론상으로는 1U 값은 16 비트 수량이 될 수 있지만 CPU가 32 비트 인 int으로 작업하고 있다고 가정합니다. 32 비트 값인지 확인하는 방법 (UINT32_C(1))이 있지만 OTT 일 수 있습니다. 코드는 32 비트 부호없는 정수 값을 명시 적으로 설정하고이를 인쇄합니다.

0

질문을 이해하는 경우 데이터를 할당하려고합니다. allocamalloc 기능을보십시오.

+0

나는 그것이 무엇이 필요한지 확신하지 못했습니다. –

관련 문제