gpt4 book ai didi

c++ - 这是将位写入大端的正确方法吗?

转载 作者:搜寻专家 更新时间:2023-10-31 00:08:10 24 4
gpt4 key购买 nike

目前,它用于Huffman 压缩算法,该算法将二进制代码分配给文本文件中使用的字符。更少的位用于更频繁的字符,更多的位用于不那么频繁的字符。

目前,我正在尝试将二进制代码 big-endian 保存在一个字节中。因此,假设我正在使用 unsigned char 来保存它。00000000我想存储一些 1101 的二进制代码。提前,如果这看起来微不足道或者是一个骗局,我想道歉,但我已经浏览了几十个其他帖子,但似乎找不到我需要的东西。如果有人可以链接或快速解释,将不胜感激。这是正确的语法吗?我会有一些外部方法,比如

int length = 0;
unsigned char byte = (some default value);
void pushBit(unsigned int bit){
if (bit == 1){
byte |= 1;
}
byte <<= 1;
length++;
if (length == 8) {
//Output the byte
length = 0;
}
}

我看过一些解释 endianess 的视频,我的理解是最重要的位(第一个)放在< strong>最低内存地址。

有些视频显示字节从左到右,这让我觉得我需要将所有内容左移,但每当我设置、切换、删除一点时,它都是从最右边开始的,不是吗?如果这是微不足道的,我再次抱歉。

所以在我的方法完成将 1101 插入此方法后,字节将类似于 00001101。这是 big endian 吗?我对地址位置的了解非常薄弱,我不确定是否**-->0000110100001101<-- **位置被认为是最重要的。我需要左移剩余的金额吗?

因为我使用了 4 位,所以我将左移 4 位以生成 11010000。这是 big endian 吗?

最佳答案

首先,正如 Killzone Kid 指出的那样,字节顺序和二进制代码的位排序是两个完全不同的东西。 Endianess 是指多字节整数在内存字节中存储的顺序。对于小尾数法,最不重要的字节首先存储。对于 big endian,首先存储最重要的字节。字节中的位不会改变顺序。 Endianess 与您的要求无关。

至于累积位直到你有一个字节值得写,你有基本的想法,但你的代码不正确。您需要先移动,然后移动位。你这样做的方式,你正在失去你放在顶部的第一位,而你写的东西的低位总是零。只需将 byte <<= 1;if 之前.

您还需要处理以某种方式结束流,如果剩下的少于八位,则写出最后的位。所以你需要一个 flushBits()如果其中有不止一位,请写出您的位缓冲区。您的比特流需要自终止,或者您需要先发送比特数,这样您就不会将最后一个字节中的填充比特误解为一个或多个代码。

关于c++ - 这是将位写入大端的正确方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50225945/

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