在T-SQL中将负十进制转换为二进制

时间:2013-05-28 13:41:51

标签: sql sql-server database sql-server-2008 tsql

我试图找到信息以及如何找到。 但它没有任何有用的信息。

使用T-SQL,我想将负十进制转换为二进制 并将其转换回来。

示例值:-9223372036854775543

我尝试使用Calculater将此值转换为Bin结果为... 1000000000000000000000000000000000000000000000000000000100001001

并转换回12月。没关系。

如何使用T-SQL(SQL2008)脚本/函数进行转换? 很长时间才能找到如何获取的信息。 任何了解这一点的人,请帮忙。

1 个答案:

答案 0 :(得分:0)

没有内置功能。 对于INT和BIGINT,您可以使用CONVERT(VARCHAR(100),CAST(3 AS VARBINARY(100)),2)将十六进制表示形式作为字符串。那么你可以做一个简单的搜索替换,因为每个十六进制数字恰好代表4位二进制数但是,如果值超出BIGINT范围,则没有关于它们如何在内部表示的标准。您可能会得到正确的结果,并且这种行为甚至可能会在不同版本之间发生变化。

关于如何表示负数,也没有标准。大多数整数实现都使用two's-complement representation。在该表示中,最顶部的位表示数字的符号。你有多少比特是一个常规的完全依赖于你的环境。

在数学-3中,二进制是-11而不是11111101。

要解决您的问题,您可以使用CLR功能,也可以用老式的方式查看您的号码:

Is it odd? -> output a 1
Is it even? -> output a 0
integer divide by 2
repeat until the value is 0

这将为您提供相反顺序的数字,因此您必须翻转结果。要获得负数n的二进制补码表示,计算1-n,使用上述算法将结果转换为二进制,但使用反转数字(0而不是1,反之亦然)。将数字翻转到正确的顺序后,加上足够的1来填充“框”。