以下都是按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
/*
名称:DectoBin
功能:十进制整数转二进制字符串
算法:
用2辗转相除至结果为1
将余数和最后的1从下向上倒序写
注意事项:
本身并不是很高效的算法,如果可以使用c的DLL,也许更好一些,
在不引入C语言dll的情况下,也算是一个将就的算法.
*/
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;