如何在 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 中?
如何在 web3.js 中将 uint32[]、uint8[] 参数传递给智能合约