oracle 位运算

来源:互联网 发布:java数组的长度单位 编辑:程序博客网 时间:2024/05/28 09:31

 

以下都是按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;