ビット演算

ビット演算子は、整数のバイナリ表記 (ビット) に対して演算を実行します。通常ビット演算子は、値の比較やマスクを行うときに使用されます。Curl® 言語には、ビット演算子を実装する以下のプリミティブが含まれています。

bit-not

プリミティブ:bit-not
要約:ビットの補数演算
構文:{bit-not number}
引数:number - int に昇格される式。これは補完する数値です。
戻り値:number のビット補数に相当する int
説明:number のビット補数を計算します。この演算子は number のバイナリ表記を反転し、01 に、10 に変換します。つまりこの演算子は number のビットを反転します。次に例を示します。
00000000 00000000 00000000 00001111 (バイナリ表記した整数 15)
11111111 11111111 11111111 11110000 (ビット補数であり、-16 に相当)
例:

例: bit-not
{text The bitwise complement of 15 is {bit-not 15}
    {br}The bitwise complement of 0b00001111 is {bit-not 0b00001111}}
注:- ビット演算子は、演算を行う前に引数を int に昇格します。また、引数の符号拡張を行います (引数が正の場合 0 が上位ビットに挿入され、負の場合は 1 が上位ビットに挿入されます)。
- Curl® 実行環境 では、バイナリ値を 2 の補数形式で処理します。
参照:API リファレンスの bit-not

bit-and

プリミティブ:bit-and
要約:ビットの論理積 (AND)
構文:{bit-and list-of-values}
引数:list-of-values - 式のカンマ区切りリストで、それぞれの式は int に昇格できます。これらは AND で結合する項です。
戻り値:引数のビット論理積に相当する int
説明:引数のビット論理積を計算します。
この演算子は、各ビットに対するビット論理積演算を実行します。各引数の右端のビット (下位ビットと呼ばれる) のビット論理積を計算し、続いてその次のビットのビット論理積を順に計算していきます。
それぞれの位置で、すべてのビットが 1 の場合、ビット論理積演算は 1 を返します。それ以外の場合は 0 を返します。
例:
00000000 00000000 00000000 00110011 (バイナリ表記の整数 51)
00000000 00000000 00000000 01010101 (整数 85)
00000000 00000000 00000000 00010001 (これら 2 つの値のビット論理積であり、17 に相当)
例:

例: bit-and
{text The bitwise AND of 51 and 85 is {bit-and 51, 85}
    {br}The bitwise AND of 0b00110011 and 0b01010101 is
    {bit-and 0b00110011, 0b01010101}}
注 :- ビット演算子は、演算を実行する前に引数を int に昇格します。また、引数の符号拡張を行います (引数が正の場合 0 が上位ビットに挿入され、負の場合は 1 が上位ビットに挿入されます)。
- bit-and に引数を与えない場合、この演算子は -1 (ビット論理積の恒等値) を返します。
- ランタイムでは、2 の補数形式でバイナリ値を処理します。
参照:API リファレンス マニュアルの bit-and

bit-or

プリミティブ:bit-or
要約:ビットの論理和 (OR)
構文:{bit-or list-of-values}
引数:list-of-values- 式のカンマ区切りリスト。これらは OR で結合する項です。
戻り値:引数のビット論理和に相当する int
説明:引数のビット論理和を計算します。
この演算子は、各ビットのビット論理和演算を実行します。各引数の右端のビット (下位ビットと呼ばれる) のビット論理和を計算し、続いてその次のビットのビット論理和を順に計算していきます。
それぞれの位置で、いずれかのビットが 1 の場合、ビット論理和演算は 1 を返します。それ以外の場合は 0 を返します。
例:
00000000 00000000 00000000 00110011 (バイナリ表記の整数 51)
00000000 00000000 00000000 01010101 (整数 85)
00000000 00000000 00000000 01110111 (これら 2 つの値のビット論理和であり、119 に相当)
例:

例: bit-or
{text The bitwise OR of 51 and 85 is {bit-or 51, 85}
    {br}The bitwise OR of 0b00110011 and 0b01010101 is
    {bit-or 0b00110011, 0b01010101}}
注 :- ビット演算子は、演算を実行する前に引数を int に昇格します。また、引数の符号拡張を行います (引数が正の場合 0 が上位ビットに挿入され、負の場合は 1 が上位ビットに挿入されます)。
- bit-or に引数を与えない場合、この演算子は 0 (ビット論理和の恒等値) を返します。
- ランタイムでは、2 の補数形式でバイナリ値を処理します。
参照:API リファレンス マニュアルの bit-or

bit-xor

プリミティブ:bit-xor
要約:ビットの排他的論理和 (XOR)。
構文:{bit-xor list-of-values}
引数:list-of-values- 式のカンマ区切りリストで、それぞれの式は int に昇格できます。これらは XOR で結合する項です。引数を与えない場合は、この演算子は 0 (ビットの排他的論理和の恒等値) を返します。
戻り値:引数のビット排他的論理和に相当する int。戻り値のデータ型は、引数のデータ型に依存します。ランタイムでは、「算術演算子」に記載されている、型の決定規則が適用されます。
説明:引数のビット排他的論理和を計算します。
この演算により、各ビットのビット排他的論理和が実行されます。各引数の右端のビット (下位ビットと呼ばれる) のビット排他的論理和を計算し、続いてその次のビットのビット排他的論理和を順に計算していきます。
それぞれの位置で、奇数のビットが 1 の場合、ビット XOR 演算は 1 を返します。それ以外の場合は 0 を返します。
例:
00000000 00000000 00000000 00110011 (バイナリ表示した整数 51)
00000000 00000000 00000000 01010101 (整数 85)
00000000 00000000 00000000 01100110 (これら 2 つの値のビット排他的論理和で、102 に相当)
例:

例: bit-xor
{text The bitwise XOR of 51 and 85 is {bit-xor 51, 85}
    {br}The bitwise XOR of 0b00110011 and 0b01010101 is
    {bit-xor 0b00110011, 0b01010101}}
注 :- ビット演算子は、演算を実行する前に引数を int に昇格します。また、引数に対して符号拡張を行います (引数が正の場合には上位ビットに 0 が挿入され、負の場合には 上位ビットに 1 が挿入されます)。
- bit-xor に引数を与えない場合、この演算は 0 (ビット排他的論理和の恒等値) を返します。
- ランタイムは、2 の補数形式でバイナリ値を処理します。
参照:API リファレンス マニュアルの bit-xor

bit-sll

プリミティブ:bit-sll
要約:ビットの左シフト
構文:{bit-sll number, shift-amount}
引数:number - 整数に昇格できる式。この引数はシフトするビットを含む項です。
shift-amount - 負でない整数。この引数は、number をシフトするビット位置の数です。この演算子は、昇格後に shift-amount を使用して、number のビット数の module を取ります。
戻り値:整数。
説明:number のバイナリ表記のビットを左へ shift-amount の数だけシフトします。0 ビット (0) が右からシフト挿入され、左にシフト アウトしたビットは捨てられます。
例:
00000000 00000000 00000000 00110011 (バイナリ表記の整数 51)
00000000 00000000 00000001 10011000 (51 を左に 3 ビットシフトさせた数で、408 に相当)
例:

例: bit-sll
{text If you shift 51 by 3 places to the left, you get {bit-sll 51, 3}.
    {br}If you shift 0b00110011 by 3 places to the left, you get
    {bit-sll 0b00110011, 3}.}
注 :- ビット演算子は、演算を実行する前に引数を int に昇格します。また、引数の符号拡張を行います (引数が正の場合には上位ビットに 0 が挿入され、負の場合には 上位ビットに 1 が挿入されます)。
- 実行環境では、バイナリ値を 2 の補数形式で処理します。
- 正の数の場合、左シフトの各位置は実質的に数値を 2 で乗算したものに相当します。
参照:API リファレンス マニュアルの bit-sll

bit-srl

プリミティブ:bit-srl
要約:ビットの右シフト
構文:{bit-srl number, shift-amount}
引数:number - int に昇格できる式。この引数はシフトするビットを含む項です。
shift-amount - 負でない整数。この引数は、number をシフトするビット位置の数です。この演算子は、昇格後に shift-amount を使用して、number のビット数の modulo を取ります。
戻り値:整数。
説明:number のバイナリ表記のビットを右へ shift-amount の数だけシフトします。0 ビット (0) が左からシフト挿入され、右にシフト アウトしたビットは捨てられます。
例:
00000000 00000000 00000000 00110011 (バイナリ表記の整数 51)
00000000 00000000 00000000 00000110 (51 を右に 3 ビットシフトさせた数で、6 に相当)
例:

例: bit-srl
{text If you shift 51 by 3 places to the right, you get {bit-srl 51, 3}.
    {br}If you shift 0b00110011 by 3 places to the right, you get
    {bit-srl 0b00110011, 3}.}
注 :- ビット演算子は、演算を実行する前に引数を int に昇格します。また、引数の符号拡張を行います (引数が正の場合には上位ビットに 0 が挿入され、負の場合には 上位ビットに 1 が挿入されます)。
- 実行環境では、バイナリ値を 2 の補数形式で処理します。
-正の数の場合、右シフトの各位置は実質的に数値を 2 で除算したものに相当します。
- 算術演算子を使用して右シフトを実行するには、ビット演算の代わりに bit-sra を使用します。
参照:API リファレンス マニュアルのbit-srlbit-sra
開発者ガイドの bit-sra

bit-sra

プリミティブ:bit-sra
要約:四則演算の右シフト
構文:{bit-sra number, shift-amount}
引数:number - int に昇格できる式。この引数はシフトするビットを含む項です。
shift-amount - 負でない整数。この引数は、number をシフトするビット位置の数です。この演算子は、昇格後に shift-amount を使用して、number のビット数の modulo を取ります。
戻り値:整数。
説明:numbershift-amount だけ右にシフトさせます。
例:

例: bit-sra
{text If you use an arithmetic shift to move 51 by 3
    places to the right, you get {bit-sra 51, 3}.
    {br}If you use an arithmetic shift to move
    0b00110011 by 3 places to the right, you get
    {bit-sra 0b00110011, 3}.}
注 :-このビット演算子は、演算を実行する前に引数を int に昇格します。また、引数の符号拡張を行います (引数が正の場合には上位ビットに 0 が挿入され、負の場合には 上位ビットに 1 が挿入されます)。
- ビット演算子を使用して右シフトを実行するには、四則演算の代わりに bit-srl を使用します。
- number が符号無しの整数の場合、この操作は bit-srl と同様です。
参照:API リファレンス マニュアルのbit-srabit-srl
開発者ガイドの bit-srl