寫了個Oracle轉(zhuǎn)換函數(shù),發(fā)現(xiàn)當(dāng)數(shù)據(jù)為負(fù)數(shù)的時候,無法轉(zhuǎn)換,因為業(yè)務(wù)前端入庫的數(shù)據(jù)是32位,當(dāng)JAVA進(jìn)行有符號轉(zhuǎn)換為INT類型的時候,會產(chǎn)生負(fù)數(shù),而我要再次轉(zhuǎn)換為二進(jìn)制進(jìn)行位的判斷,網(wǎng)上找了好多,都不能做有符號數(shù)字的轉(zhuǎn)換,因此按照負(fù)數(shù)的二進(jìn)制表示法重新寫了個函數(shù):
負(fù)數(shù)的二進(jìn)制方法的表示方法:例如 -5
第一步:首先要把5變成101的二進(jìn)制形式
-
第二步:再者就是安位取反,(形成前面全是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);
--如果為正數(shù)
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('正數(shù)結(jié)果'||V_RTN);
--補全32位高位0
SELECT lpad(V_RTN,32,0)
INTO V_RTN
FROM dual;
--dbms_output.put_line('正數(shù)補全結(jié)果'||V_RTN);
ELSE
--轉(zhuǎn)換為二進(jìn)制同時按位取反
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('負(fù)數(shù)結(jié)果'||V_RTN);
--補全32位高位1
SELECT lpad(V_RTN,32,1)
INTO V_RTN
FROM dual;
--dbms_output.put_line('負(fù)數(shù)補全1結(jié)果'||V_RTN);
--二進(jìn)制轉(zhuǎn)換為10機(jī)制,同時+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('轉(zhuǎn)換為十進(jìn)制數(shù)結(jié)果'||V_RTN);
----轉(zhuǎn)換為二進(jìn)制
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('負(fù)數(shù)轉(zhuǎn)換結(jié)果'||V_RTN);
--補全32位高位0
SELECT lpad(V_RTN,32,0)
INTO V_RTN
FROM dual;
--dbms_output.put_line('負(fù)數(shù)補全0結(jié)果'||V_RTN);
END IF;
RETURN V_RTN;
END; 本文出自:億恩科技【1tcdy.com】
服務(wù)器租用/服務(wù)器托管中國五強!虛擬主機(jī)域名注冊頂級提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM]
|