c
1inline __m128 select(__m128 v1, __m128 v2, __m128 mask) 2{ 3 __m128 t1 = _mm_andnot_ps(mask, v1); 4 __m128 t2 = _mm_and_ps(v2, mask); 5 return _mm_or_ps(t1, t2); 6}
例えば v1 が {0,1,2,3}、v2 が {4,5,6,7} で mask が {0, 0xffffffff, 0xffffffff, 0} の場合、この select() は {0,5,6,3} を返します。
。。。と、サイトのほうにのっていたのですが、いまいちよくわかりません。。
順を追って、回答しますと
andnot演算によって
まずmaskがNot演算にかけられ反転(1,0,0,1)
それを、v1にAnd演算させることにより t1=1,0,0,0
t2は
v2とmaskをAnd演算させて0,1,1,0 //ここ、なぜ0×fff..がTrueになるかわかりませんが、なんとなく。。
最後にOr演算により、retun {0,0,0,1}
bit単位の演算が理解できていないのが原因だとは思うのですが、ここでいきずまってしまっています
アドバイスお願いいたします
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。