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