次の方法で共有


~ (ビット演算子 NOT) (Transact-SQL)

整数値に対してビットごとの論理否定演算を実行します。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

~ expression

引数

  • expression
    整数型に分類されるデータ型、bit データ型、binary データ型、または varbinary データ型の有効なを指定します。expression は、ビットごとの演算では 2 進数として処理されます。

    注意

    ビットごとの演算で binary データ型または varbinary データ型として指定できる expression は、1 つだけです。

戻り値の型

入力値が int の場合は int になります。

入力値が smallint の場合は smallint になります。

入力値が tinyint の場合は tinyint になります。

入力値が bit の場合は bit になります。

説明

ビットごとの ~ 演算子は、各ビットを対象に expression に対してビットごとの論理否定演算を順番に実行します。expression の値が 0 の場合は、結果セット内のビットが 1 に設定されます。0 以外の場合は、結果セット内のビットがクリアされて値が 0 になります。つまり、1 は 0 に、0 は 1 に変更されます。

重要な注意事項重要

どのような種類のビットごとの演算を実行する場合でも、演算の中で使用される式の記憶域の長さが重要になります。値を格納するときは、式のデータ型と同じバイト数を使用するようにしてください。たとえば、10 進数の 5 を tinyint 型、smallint 型、または int 型として格納すると、値はそれぞれ異なるバイト数で格納されます。つまり、tinyint の場合は 1 バイト、smallint の場合は 2 バイト、int の場合は 4 バイトをそれぞれ使用してデータが格納されます。このため、int 型の 10 進数でビットごとの演算を実行すると、バイナリで直接実行する場合や、16 進数に変換して実行する場合とは異なる結果が得られる可能性があります。この傾向は、~ (ビットごとの NOT) 演算子において特に顕著です。また、長さが短い方の変数に対してビットごとの NOT 演算が実行される場合があります。この場合、短い変数が長いデータ型の変数に変換されると、上位 8 ビットが適切な値に設定されない可能性があります。短いデータ型を長いデータ型に変換し、その結果に対して NOT 演算を実行するようにしてください。

次の例では、int 型で値を格納するテーブルを作成し、1 行に 2 つの値を挿入します。

USE tempdb;
GO
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_NAME = 'bitwise')
DROP TABLE bitwise;
GO
CREATE TABLE bitwise
( 
a_int_value int NOT NULL,
b_int_value int NOT NULL
);
GO
INSERT bitwise VALUES (170, 75);
GO

このクエリでは、a_int_value 列と b_int_value 列に対して、それぞれビットごとの NOT を実行します。

USE tempdb;
GO
SELECT ~ a_int_value, ~ b_int_value
FROM bitwise;

以下に結果セットを示します。

--- --- 
-171  -76 

(1 row(s) affected)

170 (a_int_value または A) をバイナリで表すと 0000 0000 1010 1010 です。この値に対してビットごと NOT を実行すると、結果はバイナリで 1111 1111 0101 0101、10 進数では -171 になります。75 をバイナリで表すと、0000 0000 0100 1011 です。ビットごとの NOT 演算を実行すると、結果は 1111 1111 1011 0100、10 進数では -76 になります。

 (~A)   
         0000 0000 1010 1010
         -------------------
         1111 1111 0101 0101
(~B)   
         0000 0000 0100 1011
         -------------------
         1111 1111 1011 0100