gpt4 book ai didi

c++ - 在 C++ 中连接位

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:39:00 25 4
gpt4 key购买 nike

我正在开发一个用于卷积编码器和位打洞的软件。

所以在我的程序中,每个循环都会生成一个 55 位长度的数据。它存储在 unsigned long long 类型变量的前 55 位中。每次迭代后,我必须将这 55 位传输到 unsigned char 缓冲区(缓冲区相当大,大约 500 字节)。这些位必须连续存储在该缓冲区中。 (即没有间隙)。是否有一些小技巧可以轻松地连接起来?

最佳答案

编辑:有人正确地向我指出,因为我通过 uint64_t* 为字符缓冲区设置了别名,所以我违反了严格的别名规则,并且也容易受到攻击由于字节顺序不同而导致的错误。然而,如果您对自己的平台有一定的保证,这可能仍然有效。它可以通过使用 64 位元素的缓冲区而不是单个字节来解决。

如果您想要一个不依赖于任何外部库的准系统算法,您可以使用下面的代码片段。请注意,bitset 仅用于显示结果并确保其有效。

作为测试,我定义了一个 55 位模式,由 54 个连续的 1 组成,后跟一个 0。64 位值 (x) 中的其余 9 位也是零。缓冲区是一个 500 字节的字符数组,我在 uint64_t* 中为其设置了别名。该算法跟踪当前 64 位 block (currentBlock) 和该 block 中的当前位 (currentBit)。它执行以下操作:

  1. 移动位模式,使其从当前位位置开始。
  2. 将结果与当前 64 位 block 进行或运算。这意味着位模式的第一部分连接到当前 block 的剩余部分。例如,在第二次迭代中,当第一个 block 的前55位被填充时,剩余的9位将被占用。
  3. 更新 currentBit 变量。
  4. 检查 currentBlock 是否溢出,如果溢出则移动到下一个 block 并连接 55 位模式的剩余部分。

    #include <iostream>
    #include <bitset> // only used for testing, not for the algorithm
    using namespace std;

    int main()
    {
    size_t nBits = 55;

    // 54 1's, followed by 10 0's
    uint64_t x = 0b1111111111111111111111111111111111111111111111111111110000000000;

    // 500 byte buffer:
    char buf8[500]{};
    uint64_t *buf = reinterpret_cast<uint64_t*>(&buf8[0]);

    // This would be better; use this if possible
    // uint64_t buf[100];

    int currentBit = 0;
    int currentBlock = 0;

    // concatenate the 55-bitpattern 10 times
    for (int i = 0; i != 10; ++i)
    {
    buf[currentBlock] |= (x >> currentBit);

    currentBit += nBits;
    if (currentBit >= 64)
    {
    ++currentBlock;
    currentBit %= 64;

    buf[currentBlock] |= x << (nBits - currentBit);
    }
    }

    // TEST
    for (int i = 0; i != 5; ++i)
    cout << bitset<64>(buf[i]) << '\n';
    }

您可能应该概括这一点并将其封装在一个函数中。这取决于你。该程序按原样产生以下输出:

1111111111111111111111111111111111111111111111111111110111111111
1111111111111111111111111111111111111111111110111111111111111111
1111111111111111111111111111111111110111111111111111111111111111
1111111111111111111111111110111111111111111111111111111111111111
1111111111111111110111111111111111111111111111111111111111111111

请注意每 55 位标记 0。

关于c++ - 在 C++ 中连接位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29102517/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com