问题描述
我不确定我要做什么。我有一个 8x8
个 bits
块,存储在 8个字节
中,每个字节存储一行。完成后,我希望每个字节存储一列。
I'm not sure the exact term for what I'm trying to do. I have an 8x8
block of bits
stored in 8 bytes
, each byte stores one row. When I'm finished, I'd like each byte to store one column.
例如,完成后:
Byte0out = Byte0inBit0 + Bit0inByte1 + Bit0inByte2 + Bit0inByte3 + ...
Byte1out = Bit1inByte0 + Bit1inByte1 + Bit1inByte2 + Bit1inByte3 + ...
在 C 中表现最佳的最简单方法是什么?这将在dsPIC单片机上运行
What is the easiest way to do this in C which performs well? This will run on a dsPIC microcontroller
推荐答案
该代码直接来自,对此我不认为:
This code is cribbed directly from "Hacker's Delight" - Figure 7-2 Transposing an 8x8-bit matrix, I take no credit for it:
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;
}
我没有检查它是否按照您需要的方向旋转您可能需要调整代码。
I didn't check if this rotates in the direction you need, if not you might need to adjust the code.
此外,请记住数据类型&大小- int
& 无符号(int)
在您的平台上可能不是32位。
Also, keep in mind datatypes & sizes - int
& unsigned (int)
might not be 32 bits on your platform.
顺便说一句,我怀疑这本书(Hacker's Delight )对于您正在做的工作是必不可少的...查看一下,那里有很多很棒的东西。
BTW, I suspect the book (Hacker's Delight) is essential for the kind of work you're doing... check it out, lots of great stuff in there.
这篇关于在位上将8x8块中的位转置的最快方法是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!