c++ - 将 8 个 bool 值转换为一个字节的最佳方法?

标签 c++ performance algorithm byte bit

我想将 8 个 bool 值保存到一个字节,然后将它保存到一个文件(这项工作必须为非常大的数据完成),我使用了以下代码但我不确定它是最好的(在速度和空间方面):

int bits[]={1,0,0,0,0,1,1,1};
char a='\0';
for (int i=0;i<8;i++){
  a=a<<1;
  a+=bits[i]
}
//and then save "a"

谁能给我一个更好的代码(更快的速度)?

最佳答案

如果您不介意使用 SSE 内在函数,那么 _mm_movemask_epi8非常合身。它使用 16 个字节,但您可以将其他字节设置为零。

例如(未测试)

__m128i values = _mm_loadl_epi64((__m128i*)array);
__m128i order = _mm_set_epi8(0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
                             0, 1, 2, 3, 4, 5, 6, 7);
values = _mm_shuffle_epi8(values, order);
int result = _mm_movemask_epi8(_mm_slli_epi32(values, 7));

这假设数组是一个字符数组。如果您不能做到这一点,则需要更多的负载和包装,这会变得有点烦人。

关于c++ - 将 8 个 bool 值转换为一个字节的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28382697/

相关文章:

c++ - std::map<int,bool> 插入结果错误?

c++ - 存储霍夫曼树的有效方法

optimization - 性能优化 - Postgres

php - 算法 - 多个研讨会和时间框架之间的理想分配

c++ - AlmostEqual2sComplement 实现不处理退化的情况

c++ - boost::phoenix::sort 错误

c++ - 在 Release模式下调用 delete 时未删除 fstreams

java - 为什么我的 160kb 应用程序背景在运行时变成了 49 MB?

java - 以高效的方式计算字符串中出现的字符数?‽?

可以将罗马转换为十进制的程序的算法