Chinaunix首页 | 论坛 | 博客
  • 博客访问: 28607
  • 博文数量: 14
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 150
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-27 04:53
文章分类

全部博文(14)

文章存档

2013年(14)

我的朋友

分类: Oracle

2013-08-02 08:34:48


之前写了个转换函数,发现当数据为负数的时候,无法转换,因为业务前端入库的数据是32位,当JAVA进行有符号转换为INT类型的时候,会产生负数,而我要再次转换为二进制进行位的判断,网上找了好多,都不能做有符号数字的转换,因此按照负数的二进制表示法重新写了个函数:

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



  1. CREATE OR REPLACE FUNCTION NUMBER_2_BIT(V_NUM NUMBER) RETURN VARCHAR IS
  2.   V_RTN VARCHAR(2000);
  3.   V_N1 NUMBER;
  4.   V_N2 NUMBER;
  5. BEGIN
  6.   V_N1 := ABS(V_NUM);
  7.   --如果为正数
  8.   IF SIGN(V_NUM) > 0 THEN
  9.     LOOP
  10.       V_N2 := MOD(V_N1, 2);
  11.       V_N1 := ABS(TRUNC(V_N1 / 2));
  12.       V_RTN := TO_CHAR(V_N2) || V_RTN;
  13.       EXIT WHEN V_N1 = 0;
  14.     END LOOP;
  15.     
  16.     --dbms_output.put_line('正数结果'||V_RTN);
  17.      
  18.     --补全32位高位0
  19.     SELECT lpad(V_RTN,32,0)
  20.     INTO V_RTN
  21.     FROM dual;
  22.     
  23.      --dbms_output.put_line('正数补全结果'||V_RTN);
  24.     
  25.   ELSE
  26.     --转换为二进制同时按位取反
  27.     LOOP
  28.       V_N2 := MOD(V_N1, 2);
  29.       IF V_N2 = 1 THEN
  30.         V_N2 := 0;
  31.       ELSIF V_N2 = 0 THEN
  32.         V_N2 := 1;
  33.       END IF;
  34.       V_N1 := ABS(TRUNC(V_N1 / 2));
  35.       V_RTN := TO_CHAR(V_N2) || V_RTN;
  36.       EXIT WHEN V_N1 = 0;
  37.     END LOOP;
  38.     
  39.     --dbms_output.put_line('负数结果'||V_RTN);
  40.     
  41.     --补全32位高位1
  42.     SELECT lpad(V_RTN,32,1)
  43.     INTO V_RTN
  44.     FROM dual;
  45.     
  46.     --dbms_output.put_line('负数补全1结果'||V_RTN);
  47.     
  48.     --二进制转换为10机制,同时+1
  49.     SELECT SUM(data1) + 1
  50.     INTO V_N1
  51.       FROM (SELECT substr(V_RTN, rownum, 1) * power(2, length(V_RTN) - rownum) data1
  52.               FROM dual
  53.             CONNECT BY rownum <= length(V_RTN));
  54.     
  55.     -- dbms_output.put_line('转换为十进制数结果'||V_RTN);
  56.      
  57.     ----转换为二进制
  58.     LOOP
  59.       V_N2 := MOD(V_N1, 2);
  60.       V_N1 := ABS(TRUNC(V_N1 / 2));
  61.       V_RTN := TO_CHAR(V_N2) || V_RTN;
  62.       EXIT WHEN V_N1 = 0;
  63.     END LOOP;
  64.     
  65.     --dbms_output.put_line('负数转换结果'||V_RTN);
  66.     
  67.     --补全32位高位0
  68.     SELECT lpad(V_RTN,32,0)
  69.     INTO V_RTN
  70.     FROM dual;
  71.     
  72.     --dbms_output.put_line('负数补全0结果'||V_RTN);
  73.     
  74.   END IF;

  75.   RETURN V_RTN;
  76. END;


转载: 
http://blog.csdn.net/java3344520/article/details/6684814




阅读(720) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~