c - C语言中将一个位串分成三部分

标签 c bit bitstream

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

期望的输出:

其中,V是我的输入值,左边是前X1位数字,接下来是X1和X2之间的数字,最后是从X2到末尾的数字。有一个限制,即每个小节的长度必须大于 0。

让这件事变得困难的是我分割 x 的位置不同(X1 和 X2 可以改变)

有什么好的方法可以将它们分开吗?

最佳答案

这里的splitter()函数可以完成您所要求的工作。不幸的是,这需要很多争论。有要拆分的值 (value)、值最低有效端的 block 的大小 (p1)、中间 block 的大小 ( >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 位无符号整数值,并按原样打印它们。

关于c - C语言中将一个位串分成三部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42311028/

相关文章:

c - C 程序的输出是什么?为什么?

c++ - CS_HREDRAW | CS_VREDRAW 有什么作用?

java - 我可以简化这个吗? (字节中 1 位的异或)

python - 使用 python 将比特流保存到文件

video - 缺少音频 aac 比特流错误的错误编码文件

c - 在C中填充动态分配数组的指针算法

c - 如何获取MinGW下Windows快捷方式指向的文件大小?

c - 在任意长度的位串中删除除最左边的 1 以外的所有内容的最有效方法

java - 使用 javazoom 的播放器时遇到的问题

c - 尝试使用结构体初始化并填充二维字符数组