SQL Server十进制转二进制函数(支持正数正常转换 支持负数反码补码转换)

发布时间 2023-11-30 18:14:43作者: 猪佩奇

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=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

--调用案例