在位上将8x8块中的位转置的最快方法是什么? [英] What is the fastest way to transpose the bits in an 8x8 block on bits?

查看:112
本文介绍了在位上将8x8块中的位转置的最快方法是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我不确定我要做什么。我有一个 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

推荐答案

该代码直接来自骇客的喜悦-图7-2转置8x8位矩阵,对此我不认为:

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块中的位转置的最快方法是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆