在C中将一个位串分成三部分
Dividing a bit string into three parts in C
我目前有一个从输入文件中读取的十六进制整数值。我需要将 32 位比特流分成三个独立的部分才能对其进行操作。所需的输出如下:
期望的输出:
这里V是我的输入值,左边是前X1位,接下来是X1到X2之间的数字,最后是从X2到最后的数字。有一个约束,每个小节的长度必须大于0。
困难在于我拆分 x 的位置不同(X1 和 X2 可以改变)
有没有好的方法将它们分开?
如果我理解你的问题,你想分配数据。查看 alloca
malloc
功能。
此处的 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
。有一些方法 (UINT32_C(1)
) 可以确保它是一个 32 位值,但这可能是 OTT。该代码明确强制使用 32 位无符号整数值,并按原样打印它们。
我目前有一个从输入文件中读取的十六进制整数值。我需要将 32 位比特流分成三个独立的部分才能对其进行操作。所需的输出如下:
期望的输出:
这里V是我的输入值,左边是前X1位,接下来是X1到X2之间的数字,最后是从X2到最后的数字。有一个约束,每个小节的长度必须大于0。
困难在于我拆分 x 的位置不同(X1 和 X2 可以改变)
有没有好的方法将它们分开?
如果我理解你的问题,你想分配数据。查看 alloca
malloc
功能。
此处的 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
。有一些方法 (UINT32_C(1)
) 可以确保它是一个 32 位值,但这可能是 OTT。该代码明确强制使用 32 位无符号整数值,并按原样打印它们。