【发布时间】:2015-05-26 08:52:08
【问题描述】:
(注意,在 Neon 中,我使用 this data type 来避免处理 16 位数据类型之间的转换)
为什么在实践中内在函数中的“左移”是“右移”?
// Values contained in a
// 141 138 145 147 144 140 147 153 154 147 149 146 155 152 147 152
b = vshlq_n_u32(a,8);
// Values contained in b
// 0 141 138 145 0 144 140 147 0 154 147 149 0 155 152 147
b = vshrq_n_u32(a,8);
// Values contained in b
// 138 145 147 0 140 147 153 0 147 149 146 0 152 147 152 0
我记得在使用_mm_slli_si128 时发现了同样的情况(虽然不同,换班后的结果如下:
// b = _mm_slli_si128(a,1);
// 0 141 138 145 147 144 140 147 153 154 147 149 146 155 152 147
是因为字节序吗? 会因平台而异吗?
【问题讨论】:
-
在 C++ 中,联合不能绕过转换。
-
@BenVoigt 也许我以错误的方式使用了“绕过”一词。如果我使用链接中描述的数据类型,我可以将其用作
vshlq_n_u32、vget_low_u8、vuzp_u8等函数的输入和输出... -
也许你可以把你的手写顺序改成小端:把低地址词写在右手边,这样会更明显。
-
是的,这是字节序。如果将其打印为四个无符号 32 位值的集合,您将看到指令将它们乘以 256,并丢弃高字节(感谢更正)。
-
@user3528438 问题在于,实际上我正在处理像素(无符号字符值),并且它们按该顺序存储。
标签: c++ sse shift neon intrinsics