c++ - 连接二进制位大小的字符串

标签 c++ bit-manipulation bit

我想将一系列二进制字符串写入文件,其长度以位而不是字节表示。考虑两个字符串 s1s2,二进制分别为 011 和 01011。在这种情况下,输出文件的内容必须为:01101011(1 个字节)。我正在尝试以最有效的方式执行此操作,因为我有几百万个字符串需要连接,总共有几 GB 的输出。

最佳答案

C++ 无法直接使用位,因为它的目标是成为轻层 硬件之上,而硬件本身并不是面向位的。最低限度 在一次操作中可以读/写的位数是一个字节(通常是 8 位)。

此外,如果您需要进行磁盘 I/O,最好以 block 的形式写入数据,而不是一次写入一个字节。该库有一些缓冲,但是缓冲越早,代码速度就越快(传递数据涉及的代码越少)。

一个简单的方法可能是

unsigned char iobuffer[4096];
int bufsz; // how many bytes are present in the buffer

unsigned long long bit_accumulator;
int acc_bits; // how many bits are present in the accumulator

void writeCode(unsigned long long code, int bits) {
    bit_accumulator |= code << acc_bits;
    acc_bits += bits;
    while (acc_bits >= 8) {
        iobuffer[bufsz++] = bit_accumulator & 255;
        bit_accumulator >>= 8;
        acc_bits -= 8;
        if (bufsz == sizeof(iobuffer)) {
            // Write the buffer to disk
            bufsz = 0;
        }
    }
}

关于c++ - 连接二进制位大小的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25698007/

相关文章:

c++ - 克隆在 C++ 中导致段错误

c# - 通过 Pinvoke 传递 C# 字符串

c++ - 获取 lambda 的函数原型(prototype)

c# - 用标志方法扩展枚举?

c - 如何通过按位运算尽可能精确地计算C中整数的log2

c# - 如何有效地验证代表标记枚举的整数?

sql-server - SQL Server 中为 NULL 时的位数据类型大小

c++ - 复制整数位的最快方法

c++ - 我怎样才能让这个想法以 pre 2.x boost spirit 编译?

python - 遍历字符串列表并组合字符串值 Python