7

Let me rephrase your question: you're asking for a C- or C++-only solution that is portable. Then:

让我重新解释一下你的问题:你要求的是一个可移植的C或c++的解决方案。然后:

void transpose(uint32_t const in[4], uint32_t out[4]) {

// A B C D A E I M

// E F G H B F J N

// I J K L C G K O

// M N O P D H L P

out[0] = in[0] & 0xFF000000U; // A . . .

out[1] = in[1] & 0x00FF0000U; // . F . .

out[2] = in[2] & 0x0000FF00U; // . . K .

out[3] = in[3] & 0x000000FFU; // . . . P

out[1] |= (in[0] << 8) & 0xFF000000U; // B F . .

out[2] |= (in[0] << 16) & 0xFF000000U; // C . K .

out[3] |= (in[0] << 24); // D . . P

out[0] |= (in[1] >> 8) & 0x00FF0000U; // A E . .

out[2] |= (in[1] << 8) & 0x00FF0000U; // C G K .

out[3] |= (in[1] << 16) & 0x00FF0000U; // D H . P

out[0] |= (in[2] >> 16) & 0x0000FF00U; // A E I .

out[1] |= (in[2] >> 8) & 0x0000FF00U; // B F J .

out[3] |= (in[2] << 8) & 0x0000FF00U; // D H L P

out[0] |= (in[3] >> 24); // A E I M

out[1] |= (in[3] >> 8) & 0x000000FFU; // B F J N

out[2] |= (in[3] << 8) & 0x000000FFU; // C G K O

}

I don't see how it could be answered any other way, since then you'd be depending on a particular compiler compiling it in a particular way, etc.

我看不出它是怎么回答的,因为你会依赖于特定的编译器以特定的方式编译它,等等。

Of course if those manipulations themselves can be somehow simplified, it'd help. So that's the only avenue of further pursuit here. Nothing stands out so far, but then it's been a long day for me.

当然,如果这些操作本身可以被简化,它会有所帮助。所以这是唯一的进一步追求的途径。到目前为止,一切都还不明朗,但对我来说,这是漫长的一天。

So far, the cost is 12 shifts, 12 ORs, 16 ANDs. If the compiler and platform are any good, it can be done in 9 32 bit registers.

到目前为止,成本是12个班,12个,16个。如果编译器和平台是好的,可以在9 32位寄存器中完成。

If the compiler is very sad, or the platform doesn't have a barrel shifter, then some casting could help extol the fact that the shifts and masks are just byte extractions:

如果编译器很悲伤,或者平台没有一个桶移器,那么一些转换可以帮助说明转换和掩码只是字节提取的事实:

void transpose(uint8_t const in[16], uint8_t out[16]) {

// A B C D A E I M

// E F G H B F J N

// I J K L C G K O

// M N O P D H L P

out[0] = in[0]; // A . . .

out[1] = in[4]; // A E . .

out[2] = in[8]; // A E I .

out[3] = in[12]; // A E I M

out[4] = in[1]; // B . . .

out[5] = in[5]; // B F . .

out[6] = in[9]; // B F J .

out[7] = in[13]; // B F J N

out[8] = in[2]; // C . . .

out[9] = in[6]; // C G . .

out[10] = in[10]; // C G K .

out[11] = in[14]; // C G K O

out[12] = in[3]; // D . . .

out[13] = in[7]; // D H . .

out[14] = in[11]; // D H L .

out[15] = in[15]; // D H L P

}

If you really want to shuffle it in-place, then the following would do.

如果你真的想把它放在合适的位置,那么下面的就可以了。

void transpose(uint8_t m[16]) {

std::swap(m[1], m[4]);

std::swap(m[2], m[8]);

std::swap(m[3], m[12]);

std::swap(m[6], m[9]);

std::swap(m[7], m[13]);

std::swap(m[11], m[14]);

}

The byte-oriented versions may well produce worse code on modern platforms. Only a benchmark can tell.

面向字节的版本可能会在现代平台上产生更糟糕的代码。只有一个基准可以说明。

c语言4x4矩形转置,最快的转置4x4字节矩阵的方法。相关推荐

  1. C语言链表的转置算法,c语言编程集 数据结构 顺序表 点链表 数制转换 矩阵转置.doc...

    c语言编程集 数据结构 顺序表 点链表 数制转换 矩阵转置 #include "stdio.h" #include "malloc.h" /*typedef s ...

  2. C语言开发里指针到底快还是不快?(底层汇编解释)

    C语言开发里指针到底快还是不快? 答:不快,甚至比一般变量要慢! 近日我能看到网上很多人说指针快,我非常纳闷,因为我在学习汇编和cpu底层架构时去翻译过c语言的一些指针代码,给我的答案是:指针从来不快 ...

  3. c语言中求定积分矩形法,C语言使用矩形法求定积分的通用函数

    本文为大家分享了C语言使用矩形法求定积分的通用函数,供大家参考,具体内容如下 要求: 写一个用矩形法求定积分的通用函数,分别求:sin(x),cos(x),e^x . 分析: 矩形法,学过高等数学就知 ...

  4. C语言/C++基础之火车快跑

    C语言/C++基础之火车快跑 程序之美 前言 主体 运行效果 代码示例 代码分析 结束语 程序之美 前言 火车 作者:[土耳其]贾希特·塔朗吉 译者:余光中 朗读:月汐 去什么地方呢 这么晚了 美丽的 ...

  5. 计算机语言周长,C语言计算矩形的周长和面积

    C语言计算矩形的周长和面积 发布时间:2020-07-08 11:07:25 来源:亿速云 阅读:108 作者:Leah 本篇文章给大家分享的是有关C语言计算矩形的周长和面积,小编觉得挺实用的,因此分 ...

  6. C语言圆角矩形画法,UI们:圆角矩形环快速画法

    编按: 圆角矩形在UI中使用非常广.但如何快速地从圆角矩形做出标准的圆角矩形环(你也可以叫做中空圆角矩形)呢?简单的缩放可不成!!本文作者从认识圆角矩形开始,与大家一起绘制各种圆角矩形图案,包括圆角矩 ...

  7. 熬夜整理,从书籍到视频!最全的Go语言教程来了,快来收藏!

    随着国内越来越多的企业开始使用Go语言,Go语言一度变得火热,成为不少程序员朋友的首选语言.Go语言最早诞生于谷歌,出自谷歌的三位大牛之手,自2009年发布以来,Go语言已经度过了第12个年头,相比于 ...

  8. R语言笔记1:数据类型(向量、数组、矩阵、 列表和数据框)

    宏基因组按:科研中数据分析解读占用了我们太多时间,学习R语言是生物测序领域数据(reads count表)分析及可视化的首选.举个例子,扩增子分析从fastq到OTU表至多是de novo或refer ...

  9. python里怎么转置行列_Numbers怎样转置行列 Numbers行列转置图文教程

    Numbers怎样转置行列 Numbers行列转置图文教程 发表时间:2018-10-04 来源:必杀器整理 软件安装:装机软件 关于电脑装机必须的软件,比如windows office系列办公软件. ...

最新文章

  1. sketch如何做设计稿交互_做交互设计不可不知的十大原则
  2. python这么多包、怎么记住_学Python的人这么多 有哪些技巧可言
  3. 中文和英文对应的字节
  4. PHP在程序处理过程中动态输出内容
  5. cisco 2801 配置voip
  6. php正则表达式修正符,深入解析PHP正则模式修正符
  7. STM32 资料整理贴
  8. Hibernate Session合并,更新,保存,saveOrUpdate,持久化示例
  9. Latex安装与使用
  10. ios10 申请拍照权限_iOS 10 获取相册相机权限
  11. Hibernate必须掌握的知识
  12. Visual Studio问题汇总
  13. EF Core 日志跟踪sql语句
  14. 最左推导和最右推导,语法树,二义性文法
  15. 鞭炮游戏 甲、乙,丙三人同时开始放第一个鞭炮
  16. JS/jQuery 遍历对象属性
  17. TinyXML 指南一
  18. 关于 Facebook的 SWE_NG_GCR-SEAsia
  19. 自定义控件之Canvas图形绘制基础练习-青春痘笑脸^_^
  20. C语言封顶,喜封金顶 | 蓝天·尚东区 -C区封顶大吉 , 美好盛启!

热门文章

  1. SVN和Git的比较
  2. c语言程序设计1.9例题
  3. 中国科学院计算机网络信息中心科学数据中心,中科院计算机网络信息中心发布系列可信共享科学数据公共服务...
  4. android时间轴左右交叉布局,快速简单的定制一个时间轴布局(LinearLayout)
  5. mysql 子查询概念_聊聊MySQL的子查询
  6. 水利水电计算机考试内容及合格标准,水利水电自考本科科目及流程.docx
  7. java 抛出异常 返回值_java通过抛异常来返回提示信息
  8. Java实现自定义队列和树结构_Java数据结构之链表、栈、队列、树的实现方法示例...
  9. Python用两个骰子玩掷骰子的游戏。本金为10元,当掷出“7”即获得奖金4元,否则扣除1元。编程测算玩到多少手时钱全部输完,及哪一手时钱数最多。
  10. 从0开始利用宝塔linux面板+DSShop搭建一个简单的购物网站