【发布时间】:2014-12-01 01:26:34
【问题描述】:
我正在尝试使用内在函数将整数向右移位。下面的代码试图做到这一点,但输出看起来不像预期的那样,也许我错误地加载了数字或使用了错误的内在函数。这是输出:
2 4 8 16 32 64 128 1 2 4 8 16 32 64 128 0
512 1024 2048 4096 8192 16384 32768 0
0 8192 0 16384
8 0 16 0
我确实尝试查看此thread,但甚至没有尝试使用bitshift instructions with SSE intrinsics。
这是完整的代码(使用 SSE2 标志编译)。
#include <emmintrin.h>
#include <stdio.h>
#include <stdint.h>
void print_16_num(__m128i var)
{
uint8_t *val = (uint8_t*) &var;
printf(" %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i \n",
val[0], val[1], val[2], val[3], val[4], val[5], val[6], val[7],val[8], val[9], val[10], val[11], val[12], val[13], val[14], val[15]);
}
void print_8_num( __m128i var)
{
uint16_t *val = (uint16_t*) &var;
printf(" %i %i %i %i %i %i %i %i \n",
val[0], val[1], val[2], val[3], val[4], val[5], val[6], val[7]);
}
void print_4_num( __m128i var)
{
uint16_t *val = (uint16_t*) &var;
printf(" %i %i %i %i \n",
val[0], val[1], val[2], val[3]);
}
int main()
{
__m128i _16 = _mm_set_epi8( 128, 64, 32, 16, 8, 4, 2, 1, 128, 64, 32, 16, 8, 4, 2, 1);
print_16_num(_mm_srli_si128(_16,1));
__m128i _8 = _mm_set_epi16( 128, 64, 32, 16, 8, 4, 2, 1);
print_8_num( _mm_srli_si128(_8,1));
__m128i _4 = _mm_set_epi32( 128, 64, 32, 16);
print_4_num( _mm_srli_si128(_4,1));
_4 = _mm_set_epi32( 128, 64, 32, 16);
print_4_num( _mm_srli_epi32(_4,1));
return 0;
}
【问题讨论】:
-
根据您引用的文档,
_mm_srli_si128shifts by bytes, not bits。 -
@RaymondChen 哦,难怪它不起作用。所以我猜链接(到另一个stackoverflow问题)是按位移动的唯一方法?
-
afaik 仅移动 128 位值按字节移动,使用 64、32、16 位。我猜设计师质疑你会转移如此大的价值的业务
标签: c++ sse bit-shift intrinsics