C++ 这是将位写入big-endian的正确方法吗?

C++ 这是将位写入big-endian的正确方法吗?,c++,bit-manipulation,huffman-code,C++,Bit Manipulation,Huffman Code,目前,它适用于哈夫曼压缩算法,该算法将二进制代码分配给文本文件中使用的字符。更少的位表示更频繁的字符,更多的位表示更少频繁的字符 目前,我正在尝试将二进制代码big-endian保存在一个字节中。 假设我使用了一个未签名的字符来保存它。 00000000 我想存储一些二进制代码,即1101。 事先,我想道歉,如果这看起来微不足道或是一个骗局,但我已经浏览了几十个其他帖子,似乎无法找到我需要的。如果有人能链接或快速解释,我们将不胜感激。 这是正确的语法吗? 我会有一些外部方法,比如 int len

目前,它适用于哈夫曼压缩算法,该算法将二进制代码分配给文本文件中使用的字符。更少的位表示更频繁的字符,更多的位表示更少频繁的字符

目前,我正在尝试将二进制代码big-endian保存在一个字节中。 假设我使用了一个未签名的字符来保存它。
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;
    }
}
int-length=0;
无符号字符字节=(一些默认值);
无效pushBit(无符号整数位){
如果(位==1){
字节|=1;
}

字节
00001101
00001101
首先,正如Killzone Kid所指出的,二进制代码的endianess和位顺序是两件完全不同的事情。endianess是指多字节整数在内存字节中的存储顺序。对于小endian,最低有效字节首先存储。对于大endian,最高有效字节首先存储。字节中的位不会改变顺序。Endianess与您的请求无关


至于积累位直到你有一个字节值得写,你有基本的想法,但你的代码是不正确的。你需要先移位,然后再移位或移位。你这样做的方式是,你失去了你放在顶部的第一位,你写的东西的低位总是零。只要把
字节放在有两种类型ong>尾端、大尾端小尾端(从技术上讲,有更多的,比如中尾端,但大尾端和小尾端是最常见的)。如果您想使用大尾端格式(就像您所做的那样),则最高有效字节排在第一位,最低有效字节排在第一位

看起来您试图做的是在字节中以相反的顺序存储位本身,这不是您想要的。一个字节是endian不可知的,不需要翻转。多字节类型,如uint32\u t可能需要更改其字节顺序,这取决于您想要实现的endianness伊芙


也许您所指的是,在这种情况下,您的代码应该基本上可以工作(尽管您应该将长度与7相比,而不是8)。您在pushBit中放置位的顺序将以您传递的第一位为结束,即最重要的位(如果我们谈论的是C++,而不是C51或C++继承者),所以从高级语言的角度来看,甚至从汇编程序伪代码的角度来看,不管LSB->MSB的方向是什么,按位
字节,为什么要保存big-endian?在这种情况下,endian将对您试图实现的目标产生影响?所以让我们假设我使用一个无符号字符来保存它。00000000您的
无符号char byte
未初始化。Endianness是字节的顺序,而不是位的顺序。你称之为“bit Endianness”与Endianness完全无关。只是编译器如何选择位字段的布局。我刚刚在visual Studio中试用过,它似乎可以先执行或均衡位,然后移位,然后再移位或均衡位emed开始工作。谢谢你的建议!事实上。第二次更正。它确实产生了巨大的变化!我之前在你解释它时感到困惑,但我一点一点地打印出来(使用int 0和1表示),我注意到了。我知道我不应该用这些评论来表示感谢,而应该向你致敬,先生。我能问一下为什么“低一点”吗始终为零?希望低位不再为零,因为您已经修复了它。低位为零,因为您最后做的事情是
字节,所以00001101将意味着最左边的1位于最重要的位置?我需要像我提到的那样将其向左移动以使其为11010000吗?谢谢您的响应。字节不是e吗ndian不可知论者,但C++的
char
及其
运算符是不可知论者。