无符号右移'>>>'sql server中的运算符

Mus*_*yed 3 sql sql-server bitwise-operators sql-server-2008

如何在sql server中编写无符号右移运算符?表达就像value >>> 0

这是例如-5381 >>> 0 = 4294961915

Ed *_*d B 5

T-SQL没有位移操作符,所以你必须自己实现一个.这里有一个按位变换的实现:http://dataeducation.com/bitmask-handling-part-4-left-shift-and-right-shift/

你必须将你的整数转换为varbinary,使用按位移位函数并转换回整数和(希望)hey-presto!这是你期待的结果.

实施和测试留给读者练习......

编辑 - 为了澄清我在下面的注释中添加的内容,执行此SQL将演示各种CAST给出的不同结果:

SELECT -5381 AS Signed_Integer,
        cast(-5381 AS varbinary) AS Binary_Representation_of_Signed_Integer,
        cast(cast(-5381 AS bigint) AS varbinary) AS Binary_Representation_of_Signed_Big_Integer, 
        cast(cast(-5381 AS varbinary) AS bigint) AS Signed_Integer_Transposed_onto_Big_Integer, 
        cast(cast(cast(-5381 AS varbinary) AS bigint) AS varbinary) AS Binary_Representation_of_Signed_Integer_Trasposed_onto_Big_Integer
Run Code Online (Sandbox Code Playgroud)

结果:

Signed_Integer Binary_Representation_of_Signed_Integer                        Binary_Representation_of_Signed_Big_Integer                    Signed_Integer_Transposed_onto_Big_Integer Binary_Representation_of_Signed_Integer_Trasposed_onto_Big_Integer
-------------- -------------------------------------------------------------- -------------------------------------------------------------- ------------------------------------------ ------------------------------------------------------------------
-5381          0xFFFFEAFB                                                     0xFFFFFFFFFFFFEAFB                                             4294961915                                 0x00000000FFFFEAFB
Run Code Online (Sandbox Code Playgroud)

  • 重新阅读你的问题,我看到你实际上要做的是将有符号整数转换为无符号整数(你正在移位0位).SQL Server没有无符号整数,但它有64位的整数,并且转换为64位有符号整数的32位有符号整数的位模式给出了与32位无符号整数相同的数值通缉.试试这个:`select cast(cast(-5381 as varbinary)bigint)` (2认同)
  • 请注意,您不能只是从`int`转换为`bigint`,因为这会考虑二进制补码,如果数字为负数,则用1s填充高位4个字节; 通过varbinary进行转换使得它"忘记"了符号位,并且返回bigint假设高4位字节用0填充.请注意,您之后的结果(4294961915)超出了有符号32位整数的范围,因此您必须使用64位整数! (2认同)