之前写了个转换函数,发现当数据为负数的时候,无法转换,因为业务前端入库的数据是32位,当JAVA进行有符号转换为INT类型的时候,会产生负数,而我要再次转换为二进制进行位的判断,网上找了好多,都不能做有符号数字的转换,因此按照负数的二进制表示法重新写了个函数:
负数的二进制方法的表示方法:例如 -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;
转载:
http://blog.csdn.net/java3344520/article/details/6684814
阅读(720) | 评论(0) | 转发(0) |