高效的按位求和计算

n1r*_*r44 6 c c++ algorithm blas bitset

有没有一种有效的方法来计算uint8_t缓冲区的按位和(假设缓冲区的数量<= 255,以便我们可以求和uint8)?基本上我想知道每个缓冲区的第 i 个位置设置了多少位。

例如:对于 2 个缓冲区

uint8 buf1[k] -> 0011 0001 ...
uint8 buf2[k] -> 0101 1000 ...
uint8 sum[k*8]-> 0 1 1 2 1 0 0 1... 
Run Code Online (Sandbox Code Playgroud)

有没有 BLAS 或 boost 例程可以满足这样的要求?

在我看来,这是一个高度矢量化的操作。

更新:以下是需求的简单实现

uint8 buf1[k] -> 0011 0001 ...
uint8 buf2[k] -> 0101 1000 ...
uint8 sum[k*8]-> 0 1 1 2 1 0 0 1... 
Run Code Online (Sandbox Code Playgroud)

chu*_*ica 5

OP朴素代码的替代方案:

一次执行 8 次添加。使用查找表将 8 位扩展为 8 个字节,每个位扩展为相应的字节ones[]

void sumit(uint8_t number_of_buf, uint8_t k, const uint8_t buf[number_of_buf][k]) {
  static const uint64_t ones[256] = { 0, 0x1, 0x100, 0x101, 0x10000, 0x10001, 
      /* 249 more pre-computed constants */ 0x0101010101010101};

  uint64_t sum[k];
  memset(sum, 0, sizeof sum):

  for (size_t buf_index = 0; buf_index < number_of_buf;  buf_index++) {
    for (size_t int i = 0; i < k; i++) {
      sum[i] += ones(buf[buf_index][i]);
    }
  }

  for (size_t int i = 0; i < k; i++) {
    for (size_t bit = 0; bit < 8;  bit++) {
      printf("%llu ", 0xFF & (sum[i] >> (8*bit)));
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

另请参阅@Eric Postpischil