【发布时间】:2014-05-25 23:53:21
【问题描述】:
我正在尝试解决驱动程序问题,我必须从任意位置开始的任意位流中提取多个位。搜了一下这附近的帖子,发现涉及的Bit操作大部分都是64位机或者没有特殊的存储布局条件。
嗯,Bit 流作为 Byte 数组存储在 32 位 Micro 中。但是流是小端的,例如下面的字节流
LSBit (Bit 0) --> 0100 1001 0100 0100
在内存中存储为
字节 0 1001 0010 位布局,位 7-> 1001 0010 -> 位 0
字节 1 0010 0010 位布局,位 15-> 0010 0010 -> 位 8
这里字节中的位布局是大端,但字节是小端。
如果我必须从 Little endian 流中提取 Bit 4 到 11 以获得 0010 1001,那么我需要提取
从字节 0 开始
1001,字节 0 的高半字节
从字节 1
0010,字节 1 的低半字节
将字节 1 的左移位得到 0010 并与字节 0 的 1001 进行或运算
问题是流可以达到 64 位的长度,并且位数(最多 64 个)是任意的,起始位也是任意的。但是对于内部存储,我当然可以存储在适合这些位的适当数据类型中。
除此之外,我必须以同样的方式将它们从有效数据打包到这个 Little Big Endian 流中。 :'(
我还必须担心运行时间以及 long 是 4 个字节的事实。
因此,要存储 48 位的值,我需要维护一个以主机格式排列的 6 字节数组。 没有编译器。long long 支持
编辑:有 64 位 long long 支持;我刚刚检查了编译器手册。
请有任何建议,我现在被困了三个星期。
【问题讨论】:
-
欢迎来到 Stack Overflow。请尽快阅读About 页面。我是否正确理解您有一个以小端顺序输入的字节流,并且该字节流最长可达 8 个字节。您必须从该流中获取任意一组位并将它们存储到一个 64 位整数中(因为最多可以请求 64 位)?
-
这看起来像一个家庭作业...
-
@Joce Care 详细说明?...
-
我认为小端和大端是指单词中的字节顺序。字节数组没有字节顺序,字节也没有真正的位顺序,它们是最小的可访问内存单元。如果您在一个字节中以相反的顺序获得位,请谷歌反转位。如果您需要在字节数组中调整字节顺序,请重新排序字节。分开操作。
-
感谢您的问候。我现在正在阅读关于页面。是的,传入的流是小端的,并且以它到达的方式存储在内存中。这最终导致字节为 Little Endian,但字节中的位布局为 Big Endian :\。流最多可以是 64 位,没错,但起始位可以是任意的,位数也可以是任意的。而且 long 在 32 位 micro 上也是 4 个字节,因为编译器最大原始类型是 4 个字节。