Oracle 10进制转换2进制

2014-11-24 18:22:26 · 作者: · 浏览: 5

负数的二进制方法的表示方法:例如 -5
第一步:首先要把5变成101的二进制形式
第二步:再者就是安位取反,(形成前面全是1)010
第三步:在最后加1 形成:11111111 11111111 11111111 11111011


CREATE OR REPLACE FUNCTION NUMBER_2_BIT(V_NUM NUMBER) RETURN VARCHAR IS
V_RTN VARCHAR(2000);
V_N1 NUMBER;
V_N2 NUMBER;
BEGIN
V_N1 := ABS(V_NUM);
--如果为正数
IF SIGN(V_NUM) > 0 THEN
LOOP
V_N2 := MOD(V_N1, 2);
V_N1 := ABS(TRUNC(V_N1 / 2));
V_RTN := TO_CHAR(V_N2) || V_RTN;
EXIT WHEN V_N1 = 0;
END LOOP;

--dbms_output.put_line('正数结果'||V_RTN);

--补全32位高位0
SELECT lpad(V_RTN,32,0)
INTO V_RTN
FROM dual;

--dbms_output.put_line('正数补全结果'||V_RTN);

ELSE
--转换为二进制同时按位取反
LOOP
V_N2 := MOD(V_N1, 2);
IF V_N2 = 1 THEN
V_N2 := 0;
ELSIF V_N2 = 0 THEN
V_N2 := 1;
END IF;
V_N1 := ABS(TRUNC(V_N1 / 2));
V_RTN := TO_CHAR(V_N2) || V_RTN;
EXIT WHEN V_N1 = 0;
END LOOP;

--dbms_output.put_line('负数结果'||V_RTN);

--补全32位高位1
SELECT lpad(V_RTN,32,1)
INTO V_RTN
FROM dual;

--dbms_output.put_line('负数补全1结果'||V_RTN);

--二进制转换为10机制,同时+1
SELECT SUM(data1) + 1
INTO V_N1
FROM (SELECT substr(V_RTN, rownum, 1) * power(2, length(V_RTN) - rownum) data1
FROM dual
CONNECT BY rownum <= length(V_RTN));

-- dbms_output.put_line('转换为十进制数结果'||V_RTN);

----转换为二进制
LOOP
V_N2 := MOD(V_N1, 2);
V_N1 := ABS(TRUNC(V_N1 / 2));
V_RTN := TO_CHAR(V_N2) || V_RTN;
EXIT WHEN V_N1 = 0;
END LOOP;

--dbms_output.put_line('负数转换结果'||V_RTN);

--补全32位高位0
SELECT lpad(V_RTN,32,0)
INTO V_RTN
FROM dual;

--dbms_output.put_line('负数补全0结果'||V_RTN);

END IF;


RETURN V_RTN;
END;