mysql 10进制转2进制_Oracle 10进制转换2进制

写了个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 <= 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;

logo.gif

f68f2add0b68e4f9810432fce46917b7.png

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值