여기서 기능은 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 비트 부호없는 정수 값을 명시 적으로 설정하고이를 인쇄합니다.
적절한 수의 자리를 이동하고 결과를 원하는만큼 1 비트로 마스크하십시오. 예 : 'x & 7'은 비트 0-2,'x >> 4 & 15'를 가져와 비트 4 ~ 7을 얻습니다 ... – Ryan
7을 얻은 곳에서 혼란스러워서 비트 0-2와 4-15의 결과를 얻습니다. 비트 4-7? –
7 이진수는 111입니다. 15는 1111입니다. 0-2는 3 비트이고 4-7은 4 비트입니다. – Ryan