violin

violin

0个粉丝

7

问答

0

专栏

5

资料

violin  发布于  2013-12-10 20:57:06
采纳率 0%
7个问答
3162

如何用C语言快速实现8x8bit的矩阵转置

 
如题假设有这样一个结构:

struct TEST
{
    UI8 b0
    UI8 b1
    UI8 b2
    UI8 b3
    UI8 b4
    UI8 b5
    UI8 b6
    UI8 b7
};

定义了2个变量:
TEST t1,t2;

其中t1里的8个字节的数值已确定。

现在要进行这样的变换:

用t1中每个字节的bit0合成为一个新的字节,赋值给t1的b0.

t1中8个字节的bit1,合成为一个字节,赋值给t2中的b1....

依次类推,t1中每个字节的bit7,合成的字节赋值给t2的b7.


不知道以上的描述是否清楚。

也可以这样理解:

把t1看成一个8bit * 8bit的2维数组,对这个数组进行“行列变换”。

在stm32中,用什么样的算法才最节省时间呢?(占用内存大小及程序空间大小无限制,只要速度快)
我来回答
回答3个
时间排序
认可量排序

unsung

0个粉丝

4

问答

0

专栏

6

资料

unsung 2013-12-10 20:58:32
认可0
使用乘法很方便的,简单的写个方法
long <= t1.b3-t1.b0  // t1低四字节
long = (long & 0x01010101) * 0x01020408;  // 结果低四位在最高字节中
再处理高四位后合并低四位,其余的也类似处理


kingkong

0个粉丝

13

问答

0

专栏

12

资料

kingkong 2013-12-10 20:59:16
认可0

第一种方法的一个具体实现:

unsigned  char t1[8]={0x24,0x21,0xf0,0x7f,0x80,0x37,0xff,0x1f};//test data 
unsigned char t2[8]; 
    union  
    {  
        unsigned long l[2];  
        unsigned char c[8];  
    } Tmp;  
    unsigned char i;  
long Ll,Lh; 
for (i=0;i<8;i++) 
Tmp.c[i]=t1[i]; 
i=8; 
while(i--) 
{ 
Ll=(Tmp.l[0]&0x01010101)*0x01020408; 
Lh=(Tmp.l[1]&0x01010101)*0x01020408; 
t2[i]=unsigned char(((Lh&0x0F000000)>>20)|((Ll&0x0F000000)>>24)); 
Tmp.l[0]>>=1;Tmp.l[1]>>=1; 
}

第二种算法

#include <stdio.h>

void transpose8(unsigned char i[8], unsigned char o[8]) { 
        unsigned long x, y, t; 
        x = (i[0] << 24) | (i[1] << 16) | (i[2] << 8) | i[3]; 
        y = (i[4] << 24) | (i[5] << 16) | (i[6] << 8) | i[7];

        t = (x & 0xf0f0f0f0) | ((y >> 4) & 0x0f0f0f0f); 
        y = ((x << 4) & 0xf0f0f0f0) | (y & 0x0f0f0f0f); 
        x = t;

        t = (x ^ (x >> 14)) & 0x0000cccc; 
        x = x ^ t ^ (t << 14); 
        t = (y ^ (y >> 14)) & 0x0000cccc; 
        y = y ^ t ^ (t << 14);

        t = (x ^ (x >> 7)) & 0x00aa00aa; 
        x = x ^ t ^ (t << 7); 
        t = (y ^ (y >> 7)) & 0x00aa00aa; 
        y = y ^ t ^ (t << 7);

        o[7] = x >> 24; o[6] = x >> 16; o[5] = x >> 8; o[4] = x; 
        o[3] = y >> 24; o[2] = y >> 16; o[1] = y >> 8; o[0] = y; 
}

int main(void) { 
        int i; 
        unsigned char t1[8]={0x24,0x21,0xf0,0x7f,0x80,0x37,0xff,0x1f}; 
        unsigned char t2[8];

        transpose8(t1, t2); 
        for (i = 0; i < 8; i++) 
                printf("0x%x ", t2[i]); 
        return EOF == putchar('\n'); 
}

profile

0个粉丝

15

问答

0

专栏

20

资料

profile 2013-12-12 20:06:37
认可0
不错,学习一下
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区