写了个oracle转换函数,发现当数据为负数的时候,无法转换,,因为业务前端入库的数据是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
-- 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;
