在C

时间:2017-02-18 04:24:30

标签: c bits bitstream

我目前有一个整数值,从输入文件中读取为十六进制。我需要将32位比特流分成三个独立的部分,以便对其进行操作。所需的输出如下:

期望的输出:

在此,V是我的输入值,左边是第一个X1数字,下一个是X1和X2之间的数字,最后一个是从X2到结尾的数字。有一个约束,每个子部分的长度必须大于0。

这使得困难的原因是我分裂的位置x变化(X1和X2可以改变)

有没有一种好方法可以拆分它们?

2 个答案:

答案 0 :(得分:0)

如果我理解你的问题,你想分配数据。看看alloca malloc fucntions。

答案 1 :(得分:0)

这里的splitter()功能完成了你要求的工作。不幸的是,它需要相当多的论点。要分割的值(value),值的最低端(p1)的块的大小,中间块的大小(p2),以及然后指向高,中,低值(hi_valmd_vallo_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位无符号整数值,并按原样打印它们。