c - 反转位打包算法

标签 c algorithm memory bit-packing

我正在尝试反转我的算法,该算法将一堆无符号的短裤打包到内存中。我试图扭转它,并且在 50% - 75% 的情况下我得到了正确的数字,所以我不确定我做错了什么。

这是将数字打包到内存中的算法:

BYTE packNumber(BYTE bStart, WORD value, BYTE * buffer, DWORD * counter)
{
    value = (value<<(6-bStart));
    *(buffer + *counter) |= (BYTE)(value>>8);
    *(buffer + *counter+1) |= (BYTE)value;

    bStart = (bStart+2)%8;

    if (bStart)
        *counter+= 1;
    else
        *counter+= 2;

    return bStart;
}

这会连续调用几次,将返回的 bStart 传递到下一次调用,直到所有数字都被打包到内存中。

这是我扭转局面的尝试:

BYTE unpackNumber(BYTE bStart, WORD *value, BYTE * buffer, DWORD * counter)
{
    *value= 0;

    *value|= *(buffer + *counter);
    *value= *value<< 8;
    *value|= *(buffer + *counter+1);

    *wVal = (*value>>(6-bStart));

    bStart = (bStart+2)%8;

    if (bStart)
        *counter+= 1;
    else
        *counter+= 2;

    return bStart;
}

我知道我正在做正确的事情,因为我得到了一堆正确的数据,尽管根据我写入内存的数字,从每一个到每秒读入的数字都是错误的。

知道我在这里做错了什么吗?

最佳答案

只要快速查看代码,它看起来应该可以工作,因为 WORD 是无符号的

我几乎敢打赌它不是,并且您的移位最终会被签名(因此移入的高位不会为零,而是符号位的副本)

编辑:此外,由于您想要输出 10 位,因此您可能应该使用 *wVal &= 0x03ff 删除可能的额外高位。

这似乎适用于无符号短的 WORD;

BYTE unpackNumber(BYTE bStart, WORD *value, BYTE * buffer, DWORD * counter)
{
    *value= 0;

    *value|= *(buffer + *counter);
    *value= *value<< 8;
    *value|= *(buffer + *counter+1);

    *value = (*value>>(6-bStart)) & 0x3ff; // <-- remove extraneous bits

    bStart = (bStart+2)%8;

    if (bStart)
        *counter+= 1;
    else
        *counter+= 2;

    return bStart;
}

关于c - 反转位打包算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9233108/

相关文章:

c - 用 C 打印毕达哥拉斯三元组的表示

c++ - 从德州仪器 C200 DSP 检索代码

c - Visual Studio 2015 链接错误 LNK2005

c# - 数组的前向和后向搜索算法

java - 哪种方式消耗资源多 : static or getter/setter?

amazon-web-services - AWS ECS 任务内存硬限制和软限制

c - 二维数组和指针

algorithm - 时间复杂度 - O(n^2) 到 O(n log n) 搜索

algorithm - 最少加法--算法

java - Java中如何在位级别内部表示整数?