from:http://lzfhope.blog.163.com/blog/static/63639922007526327200/
以下都是按bit位,每位單獨運算的.
1) 與and
自有函數bitand ,這個好理解.
SQL> select bitand(2,4) from dual;
BITAND(2,4)
-----------
0
2=010,4=100 ,與之後等於0.
2) 或or
bitor(a,b)=a+b-bitand(a,b)
建立自定義函數bitor
Create or replace function bitor(a in int,b in int) return int
is
begin
return a+b-bitand(a,b);
end;
SQL> select bitor(2,4) from dual;
BITOR(2,4)
----------
6
3)異或xor
bitxor(a,b)=a+b-2*bitand(a,b);
Create or replace function bitxor(a in int,b in int) return int
is
begin
return a+b-2*bitand(a,b);
end;
SQL> select bitxor(2,10) from dual;
BITXOR(2,10)
------------
8
4)整體左移n位
a*power(2,n);
create or replace function moveleft(a in int,n in int) return int
is
begin
return a*power(2,n);
end;
SQL> select moveleft(3,1) from dual;
MOVELEFT(3,1)
-------------
6
5)整體右移n位
floor(a/power(2,n))
create or replace function moveright(a in int,n in int) return int
is
begin
return floor(a/power(2,n));
end;
SQL> select moveright(7,1) from dual;
MOVERIGHT(7,1)
--------------
3
6) 任意設置某位(n)爲1,僅限制於整數
bitor(a,power(2,n-1))
7) 任意設置某位(第n)位爲0,僅僅限制於整數
a-power(2,n-1)
上兩個可以合併在一個函數中.
create or replace function setbit(a in int,pos in int,value in int) return int
is
begin
if value=1 then
return bitor(a,power(2,pos-1));
else
return a-power(2,pos-1);
end if;
end;
SQL> select setbit(7,2,0) from dual;
SETBIT(7,2,0)
-------------
5
SQL> select setbit(8,2,1) from dual;
SETBIT(8,2,1)
-------------
10
end;
7)10進制轉二進制
CREATE OR REPLACE FUNCTION DectoBin(N IN Integer) RETURN VARCHAR2
IS
vQuotient INTEGER; --商
vRemainder INTEGER; --餘數
vRESULT VARCHAR2(100):='';
BEGIN
IF N<=1 THEN RETURN to_char(N); END IF;
IF N IS NULL THEN RETURN NULL; END IF;
vQuotient:=floor(N/2);
vRemainder:=MOD(N,2);
IF vQuotient=1 THEN
vRESULT:='1'||to_char(vremainder)||vRESULT;
ELSE
vRESULT:=to_char(Dectobin(vQuotient))||to_char(vremainder);
END IF;
RETURN vRESULT;
END;