我有 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/