ビット演算子
 
このページをシェアする                  
ビット演算子
Pervasive PSQL ビット演算子のリファレンス
この章では、以下の項目について説明します。
概要
ビット演算 AND(&)
ビット演算 NOT(~)
ビット演算 OR(|)
ビット演算 排他的OR(^)
真理値表
概要
ビット演算子を使用すると、1 つまたは複数のオペランドのビットを操作することができます。ビット演算子には次の種類があります。
演算子
説明
&
ビット演算 AND
~
ビット演算 NOT
|
ビット演算 OR
^
ビット演算 排他的 OR
式の記憶域の長さは、ビット演算を実行するときに考慮すべき重要な要因です。
ビット演算でサポートされるデータ型は次のとおりです。
BIT
TINYINT
SMALLINT
INTEGER
BIGINT
UTINYINT
USMALLINT
UINTEGER
UBIGINT
ビット演算 AND(&)
ビット演算子 AND は、2 つのオペランド間でビットごとに論理積演算を実行します。
ビット演算 AND は、2 つのビットを比較し、両方のビットの値が 1 の場合にのみ、値 1 を結果に代入します。そうでない場合は、結果のビットに 0 をセットします。AND 演算子は、その他すべてのビット演算子と同様、オペランドとして数値のみを取ります。
構文
&
は INTEGER データ型を含んでいる任意の有効な式です。ビット演算のためにバイナリ数値へ変換されます。
戻り値
異なる INTEGER データ型のオペランドを伴うビット演算 AND では、2 つのオペランドのうち、サイズの小さなデータ型の引数が大きなデータ型へ変換されるか、または大きい方の次に大きなデータ型へ変換されます。たとえば、smallint と integer の間で AND 演算を実行する場合、smallint 式は integer へ変換されます。
ビット演算 AND にかかわるオペランドが符号付きの場合、結果の値も符号付きになります。
& 演算子を IF 関数と組み合わせて使用し、テーブルがシステム テーブルかユーザー定義のテーブルかを調べることができます。
select Xf$Name, IF(Xf$Flags & 16 = 16, 'System table', 'User table') from X$File
このステートメントを Demodata サンプル データベースに対して実行すると、次の結果が返されます。
X$File System table
X$Field System table
X$Index System table
Billing User table
Class User table
Room User table
Student User table
Tuition User table
Course User table
Department User table
Enrolls User table
Faculty User table
Person User table
X$Proc System table
ビット演算 NOT(~)
ビット演算子 NOT は、あらゆる変数のビット値を反転し、その値を対応する結果のビットにセットします。
構文
~
は INTEGER データ型を含んでいる任意の有効な式です。ビット演算のためにバイナリ数値へ変換されます。
戻り値
ビット演算子 NOT は、INTEGER データ型の単一オペランドの反転を返します。すべての 1 は 0 に変換され、すべての 0 は 1 に変換されます。ビット演算子 NOT は、オペランドとして 1 つの数値のみを取ります。
次のクエリは、数値リテラルに対して補数演算を実行します。
SELECT ~12
結果は -13 です。
補数演算は符合ビットも補完するため、結果は負数になります。このため、Pervasive PSQL は結果を負数として扱います。
12 のバイナリ表現(shortint)
12 の補数
0000 0000 0000 1100
1111 1111 1111 0011
結果数値の 2 の補数は 13 です。したがって、結果は -13 になります。
メモ: チルダ(~)は、ユーザー定義名の一部として使用できません。
ビット演算 OR(|)
ビット演算子 OR は、2 つのオペランド間でビットごとの論理和演算を実行します。
ビット演算 OR は、2 つのビットを比較し、一方または両方のビットの値が 1 の場合は、値 1 を結果に代入します。入力式のどちらのビットの値も 1 でない場合は、結果のビットに 0 をセットします。OR 演算子は、オペランドとして数値のみを取ります。
構文
|
は INTEGER データ型を含んでいる任意の有効な式です。ビット演算のためにバイナリ数値へ変換されます。
戻り値
異なる INTEGER データ型のオペランドを伴うビット演算 OR では、2 つのオペランドのうち、サイズの小さなデータ型の引数が大きなデータ型へ変換されるか、または大きい方の次に大きなデータ型へ変換されます。たとえば、smallint と integer の間で OR 演算を実行する場合、smallint 式は integer へ変換されます。
ビット演算 OR にかかわるオペランドが符号付きの場合、結果の値も符号付きになります。
この例では、最初に X$Index テーブルに外部キー エントリと主キー エントリを作成する方法を示し、次に外部キーと主キーの制約の一覧を取得する方法を示します。
次のステートメントを実行すると、X$Index テーブルに 2 つのエントリが作成されます(1 つは外部キー用で、1 つは主キー用です)。
CREATE TABLE Employee
(
empid IDENTITY NOT NULL PRIMARY KEY, -- Employee ID
empname VARCHAR(50) NOT NULL, -- employee の名前
supid INTEGER NULL -- supervisor の ID
)
 
ALTER TABLE Employee
ADD CONSTRAINT SupIdMustBeValid
FOREIGN KEY (supid) REFERENCES Employee(empid)
ON DELETE CASCADE
次のステートメントを実行すると、データベース内の全テーブルに関するすべての外部キーおよび主キーの一覧が取得されます。
select B.Xf$Name "Table name", C.Xe$Name "Column name",
IF (Xi$Flags & 8192 = 0, 'Primary key', 'Foreign key')
"Key type" from X$Index A, X$File B, X$Field C
where (A.Xi$Flags & (16384 | 8192)) > 0 AND
A.Xi$File = B.Xf$Id AND
A.Xi$Field = C.Xe$Id
ステートメントを実行すると、次のようになります。
Employee empid Primary key
Employee supid Foreign key
ビット演算 排他的OR(^)
ビット演算子の排他的 OR は、2 つのオペランド間でビットごとの排他的論理和演算を実行します。
ビット演算排他的 OR は、2 つのビットを比較し、両方のビットの値が 0 または 1 の場合は、値 0 を結果に代入します。そうでない場合は、対応する結果のビットに 1 をセットします。排他的 OR 演算子は、オペランドとして数値のみを取ります。
構文
^
は INTEGER データ型を含んでいる任意の有効な式です。ビット演算のためにバイナリ数値へ変換されます。
戻り値
異なる INTEGER データ型のオペランドを伴うビット演算排他的 OR では、2 つのオペランドのうち、サイズの小さなデータ型の引数が大きなデータ型へ変換されるか、または大きい方の次に大きなデータ型へ変換されます。たとえば、smallint と integer の間で排他的 OR 演算を実行する場合、smallint 式は integer へ変換されます。
ビット演算排他的 OR にかかわるオペランドが符号付きの場合、結果の値も符号付きになります。
次の SQL クエリは、2 つの数値リテラルで排他的 OR を実行します。
SELECT 12 ^ 8
結果は 4 です。
12(shortint とします)のバイナリ表現は 0000 0000 0000 1100 で、8 のバイナリ表現は 0000 0000 0000 1000 です。これらの数値で排他的 OR 演算を実行すると、値 4 になります。
0000 0000 0000 1100 ^ 0000 0000 0000 1000
= 0000 0000 0000 0100 (4)
============ 
メモ: キャレット記号(^)は、ユーザー定義名の一部として使用できません。
真理値表
次の表は、ビット演算の真理値表です。
表 54 ビット演算の真理値表
A
B
A & B
A | B
A ^ B
~ A
0
0
0
0
0
1
0
1
0
1
1
1
1
0
0
1
1
0
1
1
1
1
0
0