右シフトの引数は、整数値かIvec値であれば何でもかまわず、暗黙的にM64データ型に変換されます。<<という演算子の1番目のオペランドまたは左側のオペランドには、I[s|u]8vec[8|16]以外のどの型でも使用できます。
/* Automatic size and sign conversion */
Is16vec4 A, C;
Iu32vec2 B;
C = A;
/* A&B returns I16vec4, which must be cast to Iu16vec4
to ensure logical shift, not arithmetic shift */
Is16vec4 A, C;
Iu16vec4 B, R;
R = (Iu16vec4)(A & B) C;
/* A&B returns I16vec4, which must be cast to Is16vec4
to ensure arithmetic shift, not logical shift */
R = (Is16vec4)(A & B) C;
操作 | 記号 | 構文の使用 | 組込み関数 |
---|---|---|---|
左シフト |
<< |
R
= A << B |
_mm_sll_si64 |
右シフト |
>> |
R
= A >> B |
_mm_srl_si64 |
符号付きのデータ型を右にシフトするときは算術演算シフトを使用します。符号なしクラスおよび中間クラスのときはすべて、論理シフトが使用されます。次の表は、最初の引数の型によって戻り値の型がどう決まるかを示したものです。
操作 | R | 右シフト | 左シフト | A | B | ||
---|---|---|---|---|---|---|---|
論理 |
I64vec1 |
>> |
>>= |
<< |
<<= |
I64vec1 A; |
I64vec1 B; |
論理 |
I32vec2 |
>> |
>>= |
<< |
<<= |
I32vec2 A |
I32vec2 B; |
算術 |
Is32vec2 |
>> |
>>= |
<< |
<<= |
Is32vec2 A |
I[s|u][N]vec[N] B; |
論理 |
Iu32vec2 |
>> |
>>= |
<< |
<<= |
Iu32vec2 A |
I[s|u][N]vec[N] B; |
論理 |
I16vec4 |
>> |
>>= |
<< |
<<= |
I16vec4 A |
I16vec4 B |
算術 |
Is16vec4 |
>> |
>>= |
<< |
<<= |
Is16vec4 A |
I[s|u][N]vec[N] B; |
論理 |
Iu16vec4 |
>> |
>>= |
<< |
<<= |
Iu16vec4 A |
I[s|u][N]vec[N] B; |