2017-02-18 73 views
-5

我目前有一个从输入文件中以十六进制读取的整数值。我需要将32位比特流分成三个独立的部分来操作它。所期望的输出是下面:将位串分成三部分C

期望的输出:

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

是什么让这个困难的是,我在哪里分裂X的位置变化(X1和X2可以改变)

是否有分割这些起来的好办法?

+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_valmd_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位无符号整数值,并打印它们。

0

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

+0

我不相信这就是所需要的。 –