我在一些代码中遇到了
_mm_movemask_epi8
内在函数,我试图通过一个示例来理解它到底是做什么的,因为我通过阅读描述并没有完全理解它的作用。
描述指出:
复制每个 8 位元素的最高有效位的值 在 [16 x i8] 的 128 位整数向量中创建 16 位掩码 值,对值进行零扩展,并将其写入目的地。
在我的具体代码中,我将以下 128 位序列传递给函数:
ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
,结果 uint16_t
是十六进制 01
(二进制 0000 00001
)。
将十六进制值转换为二进制给出:
11111111 00000000 00000000 00000000
因此,根据我对此示例的理解,该函数从上面列出的四个字节中的每一个中获取最高有效位: 11111111 00000000 0 0000000 00000000 → 1000
,然后对值进行零扩展以给出 0000000000001000
,但是该函数给出的不是二进制 1000
,而是二进制 `0001。
我哪里做错了?
在我的具体代码中,我将以下 128 位序列传递给函数:
ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
如果您使用类似
_mm_loadu_si128
的方式传递此值,则该值将被视为 Little Endian,就像通常在 x86 上一样。因此,作为 128 位整数,它是 0x00000000'00000000'00000000'000000ff
。
否则,你似乎理解正确。