在c ++中将字节流拆分为位

时间:2014-09-03 15:38:56

标签: c++ byte bit

我的程序将获得一个字节流,目前来自一个将使用二进制模式istream读取的文件。为了使用数据,我需要在程序中稍后使用各个位。目前有三件我不确定的事情,从文件中读取信息,处理它并存储以供日后使用。处理是我最不确定的部分,另外两个是次要查询。

为了接收数据,当前正在使用二进制istream是否有更快的方式来接收数据?为了存储数据,我将使用bool向量,因为在编译时不会知道大小,并且它可以扩展到几MB的数据,是否有更好的方法来存储数据?如果这对存储很重要,那么在需要这些位之前,会有另一个进程可以使用相对大量的内存。

最后一个问题,也是让我最烦恼的问题,是如何将字节拆分成位,因为这将是一个包含大量数据的循环,我希望它尽可能高效。第一个想法,也就是我目前喜欢的想法,是使用bitwise&检查该位是否已设置,然后进行比较以设置bool;

bitbool = (byte&128) != 0

接下来的方法是右移然后左移以留下最重要的位,然后移位以留下最重要的两个并使用前一个隔离第二个最重要的,但是我认为这样效率会降低比以前的方法。

最后一种方法是使用8位宽的位集转换字节然后读出位并设置bool。我不确定bitset,因为我之前没有使用它们虽然在我的研究之后似乎可以将它们用于此目的但我不确定它会有多高效。

1 个答案:

答案 0 :(得分:1)

  

为了接收数据,当前正在使用二进制istream是否有更快的方式来接收数据?

有更快的方法可以将文件中的数据传输到内存中,但大多数方法都是特定于平台的,需要OS调用或访问硬件。

从文件中读取数据的关键是保持硬盘旋转。这意味着以最少的请求读取尽可能多的数据。使用std::istream::read方法和大缓冲区。

您的程序可能执行速度低于硬盘驱动器的数据传输速率。在这种情况下,建议使用多个执行线程。一个线程将数据读入缓冲区。另一个线程从缓冲区中提取数据并对其进行处理。可能需要额外的缓冲区来调整速度差异。研究"双缓冲技术"。

  

如何将字节拆分成位?

对于大多数处理器,没有快速的方法来测试或提取位。通常,当比特位时执行速度变慢。

编写代码,然后打印出用于比特功能的汇编语言。这将指示编译器如何生成代码。

保存汇编语言列表。接下来,将编译器选项设置为高的大小。查看函数的汇编语言。与原始列表进行比较。接下来,将编译器选项设置为高速以获得速度。与原始列表进行比较。选择您认为最好的版本。如果您是平台处理器汇编语言的主人,请使用编译器的汇编语言并对其进行优化。

其他优化
首先, PROFILE 您的代码。确定瓶颈在哪里。在大多数情况下,瓶颈并不是您认为的。瓶颈代码是开始优化的地方。

尝试重新设计代码。这通常会产生最高的性能提升 例如,设计代码以减少函数调用,开关,if语句和循环。所有这些都包含跳跃或分支,这会减慢处理速度。想法最快的执行不包含跳转。

重新设计代码以提高数据缓存的使用效率。例如,如果您有4个数组,则将其更改为包含4个变量的一个结构数组:
用法不佳

  int a[10240], b[10240], c[10240], d[10240];

更好的用法

  struct Items
  {
    int a, b, c, d;
  }
  Item array[10240];

有关更多提示,请搜索StackOverflow以进行" [c ++]优化"。