我有 uint64_t (来自 C++11)表示的(二进制)矩阵。我希望能够有效地从任何列映射到第一列。例如

0 1 0 0 0 0 0 0
0 1 0 0 0 0 0 0
0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0
0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0

uint64_t matrice = 0x4040400040400040uLL;
uint64_t matrice_2 = map(matrice, ColumnEnum::Column2);

1 1 1 0 1 1 0 1
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0

矩阵_2包含0xED00000000000000uLL;

最佳答案

很好的问题。我真的很喜欢黑客攻击。这是我的解决方案:

uint64_t map(uint64_t x, int column)
{
  x = (x >> (7 - column)) & 0x0101010101010101uLL;
  x = (x | (x >> 7)) & 0x00FF00FF00FF00FFuLL;
  x = (x | (x >> 14))& 0x000000FF000000FFuLL;
  x = (x | (x >> 28))& 0x00000000000000FFuLL;
  return x << 56;
}

可以在 ideone 找到一个工作示例,其中调用实际上是 map(matrice, ColumnEnum::Column2)

关于C++ 将矩阵列映射到秩 - 位操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13425269/

10-11 15:56