シフト演算子

右シフトの引数は、整数値か Ivec 値であれば何でもかまわず、暗黙的に M64 データ型に変換されます。<< という演算子の 1 番目のオペランドまたは左側のオペランドには、I[s|u]8vec[8|16] 以外のどの型でも使用できます。

シフト演算子の構文の使用例

サイズと符号を自動変換します。

Is16vec4 A,C;

Iu32vec2 B;

C = A;

A & B は I16vec4 を返します。確実に論理シフトを行えるように、戻り値を Iu16vec4 にキャストします。

Is16vec4 A, C;

Iu16vec4 B, R;

R = (Iu16vec4)(A & B) C;

A & B は I16vec4 を返します。確実に算術シフトを行えるように、戻り値を Is16vec4 にキャストします。

R = (Is16vec4)(A & B) C;

シフト演算子と対応する組み込み関数

操作 記号 構文の使用方法 組み込み関数
左シフト <<
&=
R = A << B
R &= A
_mm_sll_si64
_mm_slli_si64
_mm_sll_pi32
_mm_slli_pi32
_mm_sll_pi16
_mm_slli_pi16
右シフト >> R = A >> B
R >>= A
_mm_srl_si64
_mm_srli_si64
_mm_srl_pi32
_mm_srli_pi32
_mm_srl_pi16
_mm_srli_pi16
_mm_sra_pi32
_mm_srai_pi32
_mm_sra_pi16
_mm_srai_pi16

符号付きのデータ型を右にシフトするときは算術シフトを使用します。符号なしクラスおよび中間クラスのときはすべて、論理シフトが使用されます。次の表は、最初の引数の型によって戻り値の型がどう決まるかを示したものです。

シフト演算子の多重定義

操作 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;