我不确定我要做什么的确切术语。我在8x8
中存储了bits
的8 bytes
块,每个字节存储一行。完成后,我希望每个字节存储一列。
例如,当我完成时:
Byte0out = Byte0inBit0 + Bit0inByte1 + Bit0inByte2 + Bit0inByte3 + ...
Byte1out = Bit1inByte0 + Bit1inByte1 + Bit1inByte2 + Bit1inByte3 + ...
在效果良好的 C 中,最简单的方法是什么?这将在dsPIC单片机上运行 最佳答案
此代码直接从"Hacker's Delight" - Figure 7-2 Transposing an 8x8-bit matrix抄写而来,对此我不认为:
void transpose8(unsigned char A[8], int m, int n,
unsigned char B[8]) {
unsigned x, y, t;
// Load the array and pack it into x and y.
x = (A[0]<<24) | (A[m]<<16) | (A[2*m]<<8) | A[3*m];
y = (A[4*m]<<24) | (A[5*m]<<16) | (A[6*m]<<8) | A[7*m];
t = (x ^ (x >> 7)) & 0x00AA00AA; x = x ^ t ^ (t << 7);
t = (y ^ (y >> 7)) & 0x00AA00AA; y = y ^ t ^ (t << 7);
t = (x ^ (x >>14)) & 0x0000CCCC; x = x ^ t ^ (t <<14);
t = (y ^ (y >>14)) & 0x0000CCCC; y = y ^ t ^ (t <<14);
t = (x & 0xF0F0F0F0) | ((y >> 4) & 0x0F0F0F0F);
y = ((x << 4) & 0xF0F0F0F0) | (y & 0x0F0F0F0F);
x = t;
B[0]=x>>24; B[n]=x>>16; B[2*n]=x>>8; B[3*n]=x;
B[4*n]=y>>24; B[5*n]=y>>16; B[6*n]=y>>8; B[7*n]=y;
}
我没有检查它是否按照您需要的方向旋转,否则,您可能需要调整代码。
另外,请记住数据类型和大小-平台上的
int
和unsigned (int)
可能不是32位。顺便说一句,我怀疑这本书(Hacker's Delight)对于您正在从事的工作是必不可少的。
关于c - 在位上将8x8块中的位转置的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6930667/