~(位非)(Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse Analytics分析平台系统(PDW)Microsoft Fabric 中的 SQL 分析终结点Microsoft Fabric 中的仓库Microsoft Fabric 中的 SQL 数据库

对整数值执行按位逻辑 NOT 运算。

Transact-SQL 语法约定

Syntax

~ expression

Arguments

expression

整数数据类型类别、二进制varbinary 数据类型的任何有效表达式。 对于位运算,expression 被视为二进制数字。

Note

位运算中,只有一个 expression 可以是 binary 或 varbinary 数据类型 。

返回类型

如果输入值为 int,则结果为 int 。

如果输入值为 smallint,则结果为 smallint 。

如果输入值为 tinyint,则结果为 tinyint 。

如果输入值为 bit,则结果为 bit

Remarks

~按位运算符对表达式执行按位逻辑NOT运算,并依次采用每个位。 如果 表达式 具有值 0,则结果集中的位设置为 1。 否则,结果中的位将被清除为值 0。 换句话说,1 改成 0,而 0 则改成 1。

Important

执行任何种类的位运算时,位运算中使用的表达式的存储长度都是很重要的。 建议您在存储值时使用该相同的字节数。 例如,如果将十进制值 5 作为 tinyint、smallint 或 int 进行存储,所生成的值将以不同字节数进行存储:tinyint 使用 1 个字节存储数据;smallint 使用 2 个字节存储数据;而 int 则使用 4 个字节存储数据。 因此,对 int 十进制值执行按位运算可能会产生与使用直接二进制或十六进制转换的数值不同的结果,尤其是在使用 (按位NOT) 运算符时~。 按位 NOT 运算可能发生在长度较短的变量上。 在这种情况下,当较短的长度转换为较长的数据类型变量时,高 8 位中的位可能不会设置为预期值。 建议将较小的数据类型变量转换为较大的数据类型,然后对结果执行 NOT 操作。

Examples

以下示例将使用 int 数据类型创建一个表,用于存储值,并将两个值插入到一行中

CREATE TABLE bitwise
(
    a_int_value INT NOT NULL,
    b_int_value INT NOT NULL
);
GO

INSERT bitwise
VALUES (170, 75);
GO

以下查询对列执行按NOTa_int_value位运算b_int_value

SELECT ~a_int_value AS NotA,
       ~b_int_value AS NotB
FROM bitwise;

结果集如下。

NotA   NotB
-----  -----
-171   -76

170(a_int_valueA)的二进制表示形式是 0000 0000 0000 0000 0000 0000 1010 1010。 对此值执行按 NOT 位运算将生成二进制结果 1111 1111 1111 1111 1111 1111 0101 0101,即 decimal -171。 75 的二进制表示形式是 0000 0000 0000 0000 0000 0000 0100 1011。 执行按位 NOT 运算将生成 1111 1111 1111 1111 1111 1111 1011 0100十进制 -76。

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