Arm 如何在霓虹灯中将uint32x4\u t转换为uint8x16\u t?

Arm 如何在霓虹灯中将uint32x4\u t转换为uint8x16\u t?,arm,simd,neon,Arm,Simd,Neon,我的意思是,我想把每个32位的无符号整数分成四个8位的整数。相应的位不变 如果uint32x4\t为: 01000101001111100000001000010000 | 01000101001111100000001000010000 | 01000101001111100000001000010000 | 01000101001111100000001000010000 我想得到: 01000101 | 00111110 | 00000010 | 00010000 | 01000101

我的意思是,我想把每个32位的无符号整数分成四个8位的整数。相应的位不变

如果
uint32x4\t
为:

01000101001111100000001000010000 | 01000101001111100000001000010000 | 01000101001111100000001000010000 | 01000101001111100000001000010000
我想得到:

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

如何执行此操作?

使用
vreiinterpretq\u u8\u u32
。原型是:

uint8x16_t vreinterpretq_u8_u32 (uint32x4_t a);

编辑:正如@EOF在下面的评论中指出的,您可能还需要一个endian交换(
vrev32q_u8
)。GCC和clang定义了
\uuuuuu字节\顺序\ uuuuuuuuuu
(对于小尾端,定义为
\uuuu字节\顺序\ uuuuuuu
),或者如果您需要更便携的东西,请参见

嗨,我试过了,但答案似乎不正确。我更新了问题。我不知道如何在评论中写下这句话。@Y.Zhu:你显然不知道endianness。你需要一个
VREV32.8
(又名
vrev32q_u8()
)。我可能应该在我的回答中提到…@Y.Zhu,ARM是双端的,所以你可能想添加一些代码来检测它,而不是仅仅假设小端。我不知道转换是什么。所有0和1都在一起模糊。你应该更好地描述它,即使是象征性的:
ABCD->BCDA
。但看起来您的第一步是将
uint32x4\u t
向量转换为
uint8x16\u t
向量。使用
vreinterprespretq\u u8\u u32执行此操作。现在有一个向量排列在8x16.Thx中,以供参考。