将8布尔值转换为一个字节的最佳方法?

我想将8个布尔值保存到一个字节,然后将其保存到文件中(此工作必须针对非常大的数据完成),我使用了以下代码,但我不确定它是最好的(用术语表示)速度和空间):

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));

假设数组是一个字符数组。如果您无法做到这一点,那么它将需要更多的负载和打包,这会变得有些烦人。

以上是 将8布尔值转换为一个字节的最佳方法? 的全部内容, 来源链接: utcz.com/qa/412700.html

回到顶部