ビット演算子

ビット演算子は、数値型に対して演算を行います。


taiseiue | 2021-12-25

ビット演算子は、数値型の値同士で使用できます。

シフト演算子

シフト演算 とは、数値を2進数表記したときに桁を左右にずらす操作の事です。まずは次の例をご覧ください。

AliceScript
var a = 5;//2進数で 0000 0101
var b = 5 << 2;
print(b);//結果 20 : 2進数で 0001 0100
var c = 5 >> 2;
print(b);//結果 20 : 2進数で 0000 0001

// 0000 0101
// 
// << 左に2ビットずらす
// 0001 0100
// 
// >> 右に2ビットずらす
// 0000 0001

シフト演算子で行われる演算でのシフト数は、右の値の下位5ビットで定義されます。つまり、シフト数はcount & 0x1Fから計算されます。

左シフト演算子 <<

左シフト演算子<<は、左の値が、右の値で指定されたビット数だけ左にシフトされます。先頭についたリテラルはその値の論理否定となります。

また、左シフト演算子では、演算結果が32ビットを超えるとき上位ビットは破棄され、下位ビットはゼロに設定されます。

次に例を示します。

AliceScript
print(2 << 2); //出力:8

右シフト演算子 >>

右シフト演算子>>は、左の値が、右の値で指定されたビット数だけ右にシフトされます。先頭についたリテラルはその値の論理否定となります。

また、右シフト演算子では、下位ビットは破棄されます。

次に例を示します。

AliceScript
print(8 >> 2); //出力:2

論理演算子

論理積演算子 &

論理積(AND)演算子&は、左右の値のビットごとの論理積を計算します。

AliceScript
var a = 0b_1001;
var b = 0b_1110;
var c = a & b;
// 出力
// 0b_0001_0100

論理和演算子 |

論理和(OR)演算子|は、左右の値のビットごとの論理和を計算します。

AliceScript
var a = 0b_1001;
var b = 0b_0110;
var c = a & b;
// 出力
// 0b_1111

排他的論理和演算子 ^

排他的論理和(XOR)演算子^は、左右の値のビットごとの排他的論理和を計算します。

AliceScript
var a = 0b_1001;
var b = 0b_1111;
var c = a ^ b;
// 出力
// 0b_0110