您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

Oracle 10进制转换2进制

2024/2/17 19:49:50发布31次查看
写了个oracle转换函数,发现当数据为负数的时候,无法转换,因为业务前端入库的数据是32位,当java进行有符号转换为int类型的时候
写了个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;
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product