二进制和十进制的互换方法

 在写block dump里解释一个rdba的概念,需要换算二进制和10进制,对于二进制和十进制的换算,Oracle没有提供 


自己写了 一个简单的处理,原理很简单, 

十进制到二进制 
不停的除以2,然后用余数留下,取整的接着循环。 
功能很简单,不支持负数和小数,有没有考虑递归算法呀。 
代码如下 
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:=v_num; 
loop 
v_n2 := mod(v_n1, 2); 
v_n1 := trunc(v_n1/2); 
--dbms_output.put_line(v_n2 || ' ' || v_n1); 
v_rtn := to_char(v_n2) || v_rtn ; 
exit when v_n1 = 0; 
end loop; 
return v_rtn; 
end; 

二进制到十进制 
上面的逆反过程 
对字符串遍历,然后用power对每个位上的进行计算乘以位上的数,然后结果相加 
代码如下 
create or replace function bit_2_number(v_bitstr varchar) return number is 
v_rtn number; 
v_nstr varchar(1000); 
begin 
v_rtn:=0; 
for i in 1..length(v_bitstr) loop 
v_rtn:= v_rtn+power(2, i-1)*substr(v_bitstr, -i, 1); 
end loop; 
return v_rtn; 
end; 

下面是我写的rdba_info的方法来调用他们 
create or replace function rdba_info(v_rdba varchar) return varchar is 
v_rtn varchar(2000); 
v_filestr varchar(2000); 
v_blockstr varchar(2000); 
v_n1 number; 
begin 
select to_number(v_rdba,'xxxxxxxxxx') into v_n1 from dual; 
v_rtn := number_2_bit(v_n1); 
select substr(v_rtn, -22, 22), substr(v_rtn, 1, length(v_rtn)-22) into v_blockstr, v_filestr from dual; 
dbms_output.put_line(v_filestr || ' ' || v_blockstr); 

return v_rtn; 
end; 

测试 
十进制到二进制 
SQL> select number_2_bit(10) from dual; 
NUMBER_2_BIT(10) 
-------------------------------------------------------------------------------- 
1010 

二进制到十进制 
SQL> select bit_2_number('1010') from dual; 
BIT_2_NUMBER('1010') 
-------------------- 
10 

RDBA测试 
SQL> select rdba_info('0381a5b1') from dual; 
RDBA_INFO('0381A5B1') 
-------------------------------------------------------------------------------- 
14========107953. 

测试全部通过,以后算RDBA就不要计算器来算了。 

附件是完整的代码,包括源码和建同义词的sql
附件
  bit_2_number.sql  (371 Bytes)

2009-11-11 21:39,下载次数: 0

  number_2_bit.sql  (460 Bytes)

2009-11-11 21:39,下载次数: 0

  rdba_info.sql  (627 Bytes)

2009-11-11 21:39,下载次数: 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

inthirties

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值