我不确定我要做什么的确切术语。我在8x8中存储了bits8 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;
}

我没有检查它是否按照您需要的方向旋转,否则,您可能需要调整代码。

另外,请记住数据类型和大小-平台上的intunsigned (int)可能不是32位。

顺便说一句,我怀疑这本书(Hacker's Delight)对于您正在从事的工作是必不可少的。

关于c - 在位上将8x8块中的位转置的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6930667/

10-12 16:36