在 Transact-SQL 語句中,將某個給定的整型值轉(zhuǎn)換為二進制表達式,對其執(zhí)行按位邏輯非運算。
~ expression
expression
是任何有效的 Microsoft® SQL Server™ 表達式(表達式必須由整數(shù)數(shù)據(jù)類型分類中的任何數(shù)據(jù)類型組成,或者由 binary 或 varbinary 數(shù)據(jù)類型組成)。expression 是一個經(jīng)過處理并轉(zhuǎn)換為二進制數(shù)字以便進行位運算的整數(shù)。
如果輸入值為 int,則返回 int;如果輸入值為 smallint,則返回 smallint;如果輸入值為 tinyint,則返回 tinyint;或者如果輸入值為 bit,則返回 bit。
通過從兩個表達式取對應的位,位運算符 ~ 對 expression 執(zhí)行按位邏輯非運算。如果 expression 中某個位(正在被解析的當前位)的值為 0,則結(jié)果中該位的值被設置為 1;否則,結(jié)果中該位的值將被清除為 0。
位運算符 ~ 只可以用在整數(shù)類型分類的列上。
重要 每當執(zhí)行任意類型的位運算時,位運算中所使用的表達式的存儲長度是非常重要的。建議在存儲值時,使用相同的字節(jié)數(shù)。例如,將十進制數(shù) 5 存儲為 tinyint、smallint 或 int 數(shù)據(jù)類型時,所生成的值將用不同的字節(jié)數(shù)存儲。tinyint 用 1 個字節(jié)存儲數(shù)據(jù),smallint 用 2 個字節(jié)存儲數(shù)據(jù),int 用 4 個字節(jié)存儲數(shù)據(jù)。因此,與直接進行二進制或十六進制轉(zhuǎn)換相比,在一個 int 數(shù)據(jù)類型的十進制數(shù)上執(zhí)行位運算會產(chǎn)生不同的結(jié)果,當使用 ~(按位 NOT)運算符時,尤其如此。按位 NOT 運算可以對長度較小的變量執(zhí)行操作,但是當該變量轉(zhuǎn)換為較長的數(shù)據(jù)類型時,則高 8 位的值就有可能與期望的值不同。建議先將數(shù)據(jù)類型較小的變量轉(zhuǎn)換為較大的數(shù)據(jù)類型,然后對所得的結(jié)果執(zhí)行按位 NOT 運算。
下面的示例創(chuàng)建一個具有 int 數(shù)據(jù)類型的表以顯示值,并將該表放入一行中。
USE master
GO
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'bitwise')
DROP TABLE bitwise
GO
CREATE TABLE bitwise
(
a_int_value tinyint NOT NULL,
b_int_value tinyint NOT NULL
)
GO
INSERT bitwise VALUES (170, 75)
GO
下面的查詢在 a_int_value 列和 b_int_value 列上執(zhí)行按位 NOT 運算。
USE MASTER
GO
SELECT ~ a_int_value, ~ b_int_value
FROM bitwise
下面是結(jié)果集:
--- ---
85 180
(1 row(s) affected)
170(a_int_value 或 A,如下所示)的二進制表示為 0000 0000 1010 1010。在該值上執(zhí)行按位 NOT 運算所產(chǎn)生的二進制結(jié)果是 0000 0000 0101 0101,即十進制數(shù) 85。
(~A)
0000 0000 1010 1010
-------------------
0000 0000 0101 0101
相關文章