SQL Server十进制转二进制函数(支持正数正常转换 支持负数反码补码转换)
CREATE FUNCTION [dbo].[ConvertBinary]
(
@Dec INT,-- 参数1:十进制数字
@StrLen INT--参数2:输出的二进制长度 正数转为二进制字符串最多31位
)
RETURNS VARCHAR(31)
AS
BEGIN
DECLARE @BinStr AS VARCHAR(31) -- 二进制表示的字符串
DECLARE @Div2 AS INT -- 商
DECLARE @Mod2 AS INT -- 模/余数
DECLARE @PDec INT=@Dec --赋值 方便后续判断正负数
SET @Div2 = ABS(@Dec) / 2
SET @Mod2 = ABS(@Dec) % 2
SET @BinStr = ''
WHILE @Div2 <> 0
BEGIN
SET @BinStr = CAST(@Mod2 AS CHAR(1)) + @BinStr
SET @Dec = ABS(@Dec) / 2
SET @Div2 = ABS(@Dec) / 2
SET @Mod2 = ABS(@Dec) % 2
END;
SET @BinStr = CAST(@Mod2 AS CHAR(1)) + @BinStr -- 至此,已完成十进制到二进制的转换
IF @StrLen > LEN(@BinStr) -- 如果用户指定的长度大于实际长度,则需要左边补0
BEGIN
IF @StrLen > 31 -- 返回的长度,最长为32
SET @StrLen = 31
DECLARE @ZeroStr VARCHAR(31) -- 需要补充的"0000..."
DECLARE @OffsetLen TINYINT -- 需要补充几个"0"
SET @ZeroStr = ''
SET @OffsetLen = @StrLen - LEN(@BinStr)
WHILE @OffsetLen > 0
BEGIN
SET @ZeroStr = @ZeroStr + '0'
SET @OffsetLen = @OffsetLen - 1
END
SET @BinStr = @ZeroStr + @BinStr
END
IF @PDec < 0 --当参数1 为负数时 进行反码 补码操作
BEGIN
--反码操作 先把1转成A,把0转成B 然后把A转成0,把B转成1
SET @BinStr=REPLACE(REPLACE(@BinStr,'1','A'),'0','B')
SET @BinStr=REPLACE(REPLACE(@BinStr,'A','0'),'B','1')
DECLARE @IntBL INT
DECLARE @XHBinStr NVARCHAR(50)=@BinStr--赋值 方便后续根据字符循环
--补码操作
WHILE len(@XHBinStr)>0
BEGIN
SET @IntBL =CAST(RIGHT(@XHBinStr, 1) AS INT)
IF @IntBL=1
BEGIN
declare @Str1 nvarchar(100)='0' --修改字符
declare @i1 int=LEN(@XHBinStr) --第几位
SET @BinStr=left(@BinStr,@i1-1)+ @Str1+right(@BinStr,len(@BinStr)-@i1)--补位操作 0替换为1
END
IF @IntBL=0
BEGIN
declare @Str nvarchar(100)='1' --修改字符
declare @i int=LEN(@XHBinStr) --第几位
SET @BinStr=left(@BinStr,@i-1)+ @Str+right(@BinStr,len(@BinStr)-@i)--补位操作 0替换为1
BREAK--结束循环
END
SET @XHBinStr = LEFT(@BinStr, LEN(@XHBinStr) - 1)
END
END
RETURN @BinStr--返回值
END
GO
--调用案例