还有要做移位操作该怎样做呢?
这些在SQLServer中都可实现。

解决方案 »

  1.   

    FUNCTION SetOneBit(AttributeNumber IN NUMBer,iBit IN NUMBER) RETURN NUMBER
    IS
       iNewAttri number:=0;
    BEGIN
      IF mod(AttributeNumber,power(2,iBit+1)) < power(2,iBit)  THEN
          iNewAttri:=AttributeNumber+power(2,iBit);
      else
          iNewAttri:=AttributeNumber;
      END IF;
      RETURN iNewAttri;
    END;
      

  2.   

    转贴:
    func_and   用于对两个数进行与操作,经常用于判断用户是否有权限等。create or replace function func_and(in_value IN NUMBER,in_mask IN NUMBER)
      return number is
      i        number;
      n_result number;
      n_value number;
      n_mask  number;
    begin
     n_value := in_value;
     n_mask  := in_mask;
     i := 0;
     n_result := n_value;
     while n_value > 0 loop
       if (mod(n_mask,2) = 0) and (mod(n_value,2) = 1) then
         n_result := n_result - power(2,i);
       end if;
       n_value := TRUNC(n_value/2);
       n_mask  := TRUNC(n_mask/2);
       i := i + 1;
     end loop;
     return n_result;
    end;
    /还可以用以下:
    UTL_RAW.BIT_AND (
       r1 IN RAW,
       r2 IN RAW) 
      RETURN RAW;UTL_RAW.BIT_OR (
       r1 IN RAW,
       r2 IN RAW) 
      RETURN RAW;select utl_raw.bit_and('1111','0000') from dual;
      

  3.   

    转贴:
    func_and   用于对两个数进行与操作,经常用于判断用户是否有权限等。create or replace function func_and(in_value IN NUMBER,in_mask IN NUMBER)
      return number is
      i        number;
      n_result number;
      n_value number;
      n_mask  number;
    begin
     n_value := in_value;
     n_mask  := in_mask;
     i := 0;
     n_result := n_value;
     while n_value > 0 loop
       if (mod(n_mask,2) = 0) and (mod(n_value,2) = 1) then
         n_result := n_result - power(2,i);
       end if;
       n_value := TRUNC(n_value/2);
       n_mask  := TRUNC(n_mask/2);
       i := i + 1;
     end loop;
     return n_result;
    end;
    /还可以用以下:
    UTL_RAW.BIT_AND (
       r1 IN RAW,
       r2 IN RAW) 
      RETURN RAW;UTL_RAW.BIT_OR (
       r1 IN RAW,
       r2 IN RAW) 
      RETURN RAW;select utl_raw.bit_and('1111','0000') from dual;