4D v14.3

ビットワイズ演算子

ホーム

 
4D v14.3
ビットワイズ演算子

ビットワイズ演算子  


 

 

ビットワイズ演算子は、倍長整数式や値に対して演算を行います。

Note: ビットワイズ演算子に整数値または実数値を渡すと、4Dは値を倍長整数値として評価してから、ビットワイズ演算子を使用した式を計算します。

ビットワイズ演算子を使用する場合、倍長整数値を32ビットの配列と考える必要があります。これらのビットには、右から左に0~31の番号が付けられます。

それぞれのビットは0か1なので、倍長整数値は32の論理値を格納できる値と考えることもできます。1に等しいビットはTrue、0に等しいビットはFalseを意味します。

ビットワイズ演算子を使用する式は倍長整数値を返します。Bit Test演算子は例外的に式がブール値を返します。次の表にビットワイズ演算子とそのシンタックスを示します:

処理演算子シンタックス戻り値
Bitwise AND&Long & LongLong
Bitwise OR (inclusive)|Long | LongLong
Bitwise XOR (exclusive)^|Long ^| LongLong
Left Bit Shift<<Long << LongLong(see note 1)
Right Bit Shift>>Long >> LongLong(see note 1)
Bit Set?+Long ?+ LongLong(see note 2)
Bit Clear?-Long ?- LongLong(see note 2)
Bit Test??Long ?? LongBool(see note 2)

Notes

(1) Left Bit ShiftおよびRight Bit Shift演算では、2番目のオペランドは、結果値において1番目のオペランドのビットがシフトされるビット数を示します。したがって、この2番目のオペランドは、0~32の間でなければなりません。0ビットシフトするとその値がそのまま返されます。また、31ビットより多くシフトするとすべてのビットがなくなるので、0x00000000が返されます。それ以外の値を2番目のオペランドとして渡した場合、結果は意味のない値になります。
(2) Bit SetBit ClearBit Test演算では、2番目のオペランドは、作用の対象となるビット番号を示します。したがって、この2番目のオペランドは0~31の間です。そうでない場合、Bit SetBit Clearに対しては1番目のオペランドがそのまま返され、Bit Testに対してはFalseが返されます。

次の表は、ビットワイズ演算子とその効果を示します:

処理説明
Bitwise ANDそれぞれの結果ビットは2つのオペランドのビットの論理ANDです。
下記は、論理ANDの真偽表です:
1 & 1 --> 1
0 & 1 --> 0
1 & 0 --> 0
0 & 0 --> 0
すなわち、両オペランドのビットが1の場合、結果ビットが1になり、その他の場合は結果ビットが0になります。
Bitwise OR (inclusive)それぞれの結果ビットは2つのオペランドのビットの論理ORです。
下記は、論理ORの真偽表です:
1 | 1 --> 1
0 | 1 --> 1
1 | 0 --> 1
0 | 0 --> 0
すなわち、いずれかのオペランドのビットが1の場合、
結果ビットが1になり、その他の場合は結果ビットが0になります。
Bitwise XOR (exclusive)それぞれの結果ビットは2つのオペランドのビットの排他的論理ORです。
下記は、排他的論理ORの真偽表です:
1 ^| 1 --> 0
0 ^| 1 --> 1
1 ^| 0 --> 1
0 ^| 0 --> 0
すなわち、オペランドのビットのいずれか一方だけが1の場合、
結果ビットが1になり、その他の場合は結果ビットが0になります。
Left Bit Shift最初のオペランド値が結果値に設定され、次に結果ビットが2番目のオペランドで示されたビット数だけ左にシフトします。左側のビットがなくなり、右側の新しいビットは0に設定されます。
Note: 正の数だけを考えると、Nビット左にシフトすることは、2^Nを掛けることと同じです。
Right Bit Shift最初のオペランド値が結果値に設定され、次に結果ビットが2番目のオペランドで示されたビット数だけ右にシフトします。右側のビットがなくなり、左側の新しいビットは0に設定されます。
Note: 正の数だけを考えると、Nビット左にシフトすることは、2^Nで割ることと同じです。
Bit Set最初のオペランド値が結果値に設定され、次に結果ビットのうち2番目のオペランドで示されたビットが1に設定されます。他のビットはそのままです。
Bit Clear最初のオペランド値が結果値に設定され、次に結果ビットのうち2番目のオペランドで示されたビットが0に設定されます。他のビットはそのままです。
Bit Test最初のオペランドのうち、2番目のビットで示されたビットが1の場合、Trueが返されます。最初のオペランドのうち、2番目のビットで示されたビットが0の場合、Falseが返されます。

例題  

(1) 次の表にそれぞれのビット演算子の例を示します:

処理例題結果
Bitwise AND0x0000FFFF & 0xFF00FF000x0000FF00
Bitwise OR (inclusive)0x0000FFFF | 0xFF00FF000xFF00FFFF
Bitwise XOR (exclusive)0x0000FFFF ^| 0xFF00FF000xFF0000FF
Left Bit Shift0x0000FFFF << 80x00FFFF00
Right Bit Shift0x0000FFFF >> 80x000000FF
Bit Set0x00000000 ?+ 160x00010000
Bit Clear0x00010000 ?- 160x00000000
Bit Test0x00010000 ?? 16True

(2) 4Dは多くの定義済み定数を提供しています。これらの定数の中には、そのリテラルが"bit"または"mask"で終わるものがあります。例えばテーマで提供される定数の場合を以下に示します:

定数
Changed resource bit 倍長整数 1
Changed resource mask 倍長整数 2
Locked resource bit 倍長整数 4
Locked resource mask 倍長整数 16
Preloaded resource bit 倍長整数 2
Preloaded resource mask 倍長整数 4
Protected resource bit 倍長整数 3
Protected resource mask 倍長整数 8
Purgeable resource bit 倍長整数 5
Purgeable resource mask 倍長整数 32
System heap resource bit 倍長整数 6
System heap resource mask 倍長整数 64

これらの定数により、Get resource propertiesが返した値をテストしたり、SET RESOURCE PROPERTIESに渡す値を作成したりすることができます。リテラルが"bit"で終わる定数は、テスト、消去またはセットするビットの位置を指定します。リテラルが"mask"で終わる定数は、テスト、消去またはセットするビットが1の場合のみ、倍長整数値を指定します。

例えば、(変数$vlResAttrにプロパティを取得した) リソースがパージ可能かどうかをテストするには、以下のように記述します:

 If($vlResAttr ?? Purgeable resource bit) ` リソースはパージ可能か?

または:

 If(($vlResAttr  & Purgeable resource mask)#0) ` リソースはパージ可能か?

逆に、これらの定数を使用して同じビットを設定することもできます。以下のように記述します:

 $vlResAttr:=$vlResAttr ?+Purgeable resource bit

または:

 $vlResAttr:=$vlResAttr |Purgeable resource bit

(3) この例では、2つの整数値を倍長整数値に格納します。以下のように記述します:

 $vlLong:=($viIntA<<16)|$viIntB  ` 2つの整数を倍長整数に格納
 
 $vlIntA:=$vlLong>>16 ` ハイワードに格納されている整数を取り出します
 
 $viIntB:=$vlLong  & 0xFFFF ` ローワードに格納されている整数を取り出します

Tip: 倍長整数または整数の値を数値とビットワイズ演算子を組み合わせた式で処理する場合は注意が必要です。ハイビット(倍長整数の場合はビット31、整数の場合はビット15)は符号を設定します。その値が消去された場合には正の数で、値が設定された場合には負の数です。数値演算子はこのビットを使用して、値の符号を検出します。 ビットワイズ演算子はこのビットの意味を無視します。

 
プロパティ 

プロダクト: 4D
テーマ: 演算子

 
参照 

ピクチャ演算子
数値演算子
文字列演算子
日付演算子
時間演算子
比較演算子
演算子
論理演算子

 
ARTICLE USAGE

ランゲージリファレンス ( 4D v12.4)
ランゲージリファレンス ( 4D v11 SQL Release 6)
ランゲージリファレンス ( 4D v14 R3)
ランゲージリファレンス ( 4D v14 R2)
ランゲージリファレンス ( 4D v13.5)
ランゲージリファレンス ( 4D v14.3)
ランゲージリファレンス ( 4D v14 R4)