~ (位元 NOT) (Transact-SQL)

在整數值上,執行位元邏輯 NOT 運算。

主題連結圖示Transact-SQL 語法慣例

語法

~ expression

引數

  • expression
    這是整數資料類型類別目錄之任何資料類型、bit 或 binary 或 varbinary 資料類型的任何有效運算式。expression 是當作位元運算的二進位數來處理的。

    [!附註]

    在位元運算中,只有一個 expression 可以是 binary 或 varbinary 資料類型。

結果類型

如果輸入值是 int,便是 int。

如果輸入值是 smallint,便是 smallint。

如果輸入值是 tinyint,便是 tinyint。

如果輸入值是 bit,便是 bit。

備註

~ 位元運算子會執行 expression 的位元邏輯 NOT 運算,依次處理每個位元。如果 expression 的值是 0,結果集中的位元便設為 1;否則,則清除結果中的位元成為 0 值。換言之,一會改成零,零會改成一。

重要注意事項重要事項

當您執行任何種類的位元運算時,位元運算所用的運算式儲存長度非常重要。我們建議您在儲存值時,使用這個相同的位元組數。例如,將小數點值 5 儲存成 tinyint、smallint 或 int,會產生用不同位元組數目來儲存的值:tinyint 會利用 1 位元組來儲存資料;smallint 會利用 2 位元組來儲存資料;int 會利用 4 位元組來儲存資料。因此,在 int 十進位值上執行位元運算,與使用直接二進位或十六進位轉換,可能會產生不同的結果,當使用 ~ (位元 NOT) 運算子時,尤其如此。位元 NOT 運算可能發生在長度較短的變數上。在這個情況下,當較短的長度轉換成較長的資料類型變數時,上面 8 位元中的位元可能不會設為預期的值。我們建議您將較小的資料類型變數轉換成較長的資料類型,之後,在結果上執行 NOT 運算。

範例

下列範例會利用 int 資料類型建立資料表來儲存值以及將兩個值插入單一資料列中。

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,也就是十進位的 -171。75 的二進位表示法是 0000 0000 0100 1011。執行位元 NOT 運算會產生 1111 1111 1011 0100,也就是十進位的 -76。

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