~ (位元 NOT) (Transact-SQL)
在整數值上,執行位元邏輯 NOT 運算。
語法
~ expression
引數
expression
這是整數資料類型類別目錄之任何資料類型、bit 或 binary 或 varbinary 資料類型的任何有效運算式。 expression 是當做位元運算的二進位數來處理的。[!附註]
在位元運算中,只有一個 expression 可以是 binary 或 varbinary 資料類型。
結果類型
如果輸入值是 int,便是 int。
如果輸入值是 smallint,便是 smallint。
如果輸入值是 tinyint,便是 tinyint。
如果輸入值是 bit,便是 bit。
備註
~ 位元運算子會執行 expression 的位元邏輯 NOT 運算,依次處理每個位元。 如果 expression 的值為 0,結果集中的位元就會設為 1;否則,結果中的位元會清除為 0。 換句話說,1 會變更為零,零則會變更為 1。
重要事項 |
---|
當您執行任何種類的位元運算時,位元運算所用的運算式儲存長度非常重要。 我們建議您在儲存值時,使用這個相同的位元組數。 例如,將小數點值 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