如何在 Neon 中将 uint32x4_t 转换为 uint8x16_t?

Posted

技术标签:

【中文标题】如何在 Neon 中将 uint32x4_t 转换为 uint8x16_t?【英文标题】:How to convert uint32x4_t to uint8x16_t in Neon? 【发布时间】:2017-06-16 06:19:57 【问题描述】:

那么我的意思是我想将每个 32 位 unsigned int 拆分为四个 8 位。对应位不变。

如果uint32x4_t 是:

01000101001111100000001000010000 | 01000101001111100000001000010000 | 01000101001111100000001000010000 | 01000101001111100000001000010000

我想得到:

 01000101 | 00111110 | 00000010 | 00010000 | 01000101 | 00111110 | 00000010 | 00010000 | 01000101 | 00111110 | 00000010 | 00010000 | 01000101 | 00111110 | 00000010 | 00010000 |

我该怎么做?

【问题讨论】:

我不知道转换是什么。所有的 0 和 1 都模糊在一起。你应该更好地描述它,即使是象征性的:ABCD -> BCDA。但看起来您的第一步是将uint32x4_t 向量转换为uint8x16_t 向量。使用vreinterpretq_u8_u32 执行此操作。现在你有一个以 8x16 排列的向量。 谢谢建议。 【参考方案1】:

vreinterpretq_u8_u32。原型是:

uint8x16_t vreinterpretq_u8_u32 (uint32x4_t a);

编辑:正如@EOF 在下面的评论中指出的那样,您可能还需要一个字节序交换 (vrev32q_u8)。 GCC 和 clang 定义了__BYTE_ORDER__(小端为__ORDER_LITTLE_ENDIAN__,大端为__ORDER_BIG_ENDIAN__),或者如果你需要更便携的东西,请参阅https://github.com/nemequ/portable-snippets/tree/master/endian

【讨论】:

您好,我试过了,但似乎答案不正确。 我更新了问题。我不知道如何在评论中写这个。 @Y.Zhu:你显然不知道endianness。你需要一个VREV32.8(又名vrev32q_u8())。 我可能应该在我的回答中提到……@Y.Zhu,ARM 是双端的,所以你可能想添加一些代码来检测它,而不是仅仅假设小端。跨度>

以上是关于如何在 Neon 中将 uint32x4_t 转换为 uint8x16_t?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ARM NEON 中将 uint8x8_t 加载到 float32x4 中?

使用NEON内在函数除以浮点数

优化NEON XOR实施

如何在 web3.js 中将 uint32[]、uint8[] 参数传递给智能合约

如何在 Swift 2.3 中将 UInt8 转换为 Anyobject

NEON:如何将 128 位 ARGB 转换为具有饱和度的 32 位 ARGB?