Now: Tutorial for Web and Software Design > Database > MS SQL > Database Content
> Bitwise Math and Masking Functions [Bookmark it]
Bitwise Math and Masking Functions
SQL Scripts
June 2, 2006
Bitwise Math and Masking Functions


>>Script Language and Platform: Oracle
This script performs bitwise math and masking operations on numbers. Performs the bitwise operations "AND", "OR", "XOR" and "NOT"; Turns a mask of bits ON or OFF in a larger array of bits; Tests whether a number is a "single bit" number; Tests whether a mask of bits is ON in a larger array of bits.

Author: Michael Donnelly



--

-- This script is (c) 2004 Michael V. Donnelly

-- 

CREATE OR REPLACE PACKAGE bitwise

IS

-- This function is the same as the Oracle SQL Function BITAND

-- Example:

--

-- BIT_AND(4,8) = 0

--

FUNCTION BIT_AND

( param1 IN NUMBER, 

param2 IN NUMBER)

RETURN NUMBER DETERMINISTIC;

-- This function implements the bitwise OR function

-- Example:

--

-- BIT_OR(4,8) = 12

--

FUNCTION BIT_OR

( param1 IN NUMBER, 

param2 IN NUMBER)

RETURN NUMBER DETERMINISTIC;

-- This function implements the bitwise XOR function

-- Example:

--

-- BIT_XOR(2,6) = 4

--

FUNCTION BIT_XOR

( param1 IN NUMBER, 

param2 IN NUMBER)

RETURN NUMBER DETERMINISTIC;

-- This function ensures that the bit(s) in param2 are "On" in

-- param1, regardless of whether they were on or off to begin

-- with. This is equivalent to the bit_or() function, but

-- is included because it is conceptually distinct.

FUNCTION TURN_BITS_ON

( bitarray IN NUMBER, 

mask IN NUMBER)

RETURN NUMBER DETERMINISTIC;

-- This function ensures that the bit(s) in param2 are "Off" in

-- param1, regardless of whether they were on or off to begin

-- with. This is equivalent to performing a bit_or to ensure 

-- that the bits are "On" and then performing a bit_xor on the

-- result, to ensure that the bits are now off.

FUNCTION TURN_BITS_OFF

( bitarray IN NUMBER, 

mask IN NUMBER)

RETURN NUMBER DETERMINISTIC;

-- This function implements the bitwise NOT function

-- 'length' indicates the size of a bit array.

-- Example:

--

-- length = 4

-- array = 1111 (15)

-- BIT_NOT(2,4) = BIT_XOR(2,15)

--

-- If the length of the array represented by 'length'

-- contains fewer binary positions than the array

-- represented by 'param1', the NOT will be performed

-- against an array of the same length as 'param1'

-- Example:

--

-- length = 2

-- array = 11 (3)

-- param1 = 8 (0001)

-- BIT_NOT(8,2) = BIT_XOR(8,15)

--

FUNCTION BIT_NOT

( param1 IN NUMBER,

length IN NUMBER)

RETURN NUMBER DETERMINISTIC;

-- This function determines whether 'param' is an exponent of 2

-- It retuns 'Y' if a single bit is set in the number,

-- 'N' if more than one bit.

-- Example:

--

-- IS_BIT(4) (Y)

-- IS_BIT(6) (N) 

FUNCTION IS_BIT

( param IN NUMBER)

RETURN CHAR DETERMINISTIC;

-- This function determines whether the bit 'mask' is set in

-- the number 'bitarray'

-- If the bit is set, 'Y' is returned. If not, 'N' is returned.

-- Example:

--

-- 10 = 0101

-- IS_MASKED(10,2) (Y)

-- IS_MASKED(10,4) (N)

FUNCTION IS_MASKED

( bitarray IN NUMBER,

mask IN NUMBER )

RETURN CHAR DETERMINISTIC;

END;

/

CREATE OR REPLACE PACKAGE BODY bitwise

IS

FUNCTION BIT_AND

( param1 IN NUMBER, 

param2 IN NUMBER)

RETURN NUMBER IS

BEGIN 

RETURN BITAND(param1,param2);

END BIT_AND;



FUNCTION BIT_OR

( param1 IN NUMBER, 

param2 IN NUMBER)

RETURN NUMBER IS

BEGIN 

RETURN ((param1 + param2) - BITAND(param1,param2));

END BIT_OR;

FUNCTION BIT_XOR

( param1 IN NUMBER, 

param2 IN NUMBER)

RETURN NUMBER IS

BEGIN 

RETURN ((param1 + param2) - (2 * BITAND(param1,param2)));

END BIT_XOR;

FUNCTION BIT_NOT

( param1 IN NUMBER,

length IN NUMBER)

RETURN NUMBER IS

cur_len NUMBER;

i NUMBER;

param2 NUMBER;

ret_val NUMBER;

BEGIN 

param2 := 0;

cur_len := length - 1;

i := 0;

WHILE cur_len > -1 LOOP

param2 := param2 + POWER(2,cur_len);

cur_len := cur_len - 1;

END LOOP;

WHILE param2 < param1 LOOP

param2 := param2 + POWER(2,length + i);

i := i + 1;

END LOOP;

RETURN ((param1 + param2) - (2 * BITAND(param1,param2)));

END BIT_NOT;

FUNCTION TURN_BITS_ON

( bitarray IN NUMBER, 

mask IN NUMBER)

RETURN NUMBER IS

BEGIN

RETURN BITWISE.bit_or(bitarray,mask);

END TURN_BITS_ON;

FUNCTION TURN_BITS_OFF

( bitarray IN NUMBER, 

mask IN NUMBER)

RETURN NUMBER IS

BEGIN

RETURN BITWISE.bit_xor(

BITWISE.TURN_BITS_ON(bitarray,mask), -- Same as bit_or

mask

);

END TURN_BITS_OFF;

FUNCTION IS_BIT

( param IN NUMBER)

RETURN CHAR IS

cur_val NUMBER;

test_val NUMBER;

loop_ct NUMBER;

ret_val CHAR;

BEGIN

cur_val := ABS(param);

IF cur_val = 1 OR cur_val = 0 THEN

RETURN 'Y';

END IF;

IF BITWISE.is_masked(cur_val,1)='Y' THEN

RETURN 'N';

END IF;

-- cur_val is a positive multiple of 2.

loop_ct := 0;

test_val := 0;

WHILE test_val <= cur_val LOOP

test_val := POWER(2,loop_ct);

loop_ct := loop_ct + 1;

IF test_val = cur_val THEN

RETURN 'Y';

END IF;

END LOOP;

RETURN 'N';

RETURN ret_val;

END IS_BIT;

FUNCTION IS_MASKED

( bitarray IN NUMBER,

mask IN NUMBER )

RETURN CHAR

IS

ret_val CHAR;

BEGIN

IF BITAND(mask,bitarray) = mask THEN

ret_val := 'Y';

ELSE

ret_val := 'N';

END IF;

RETURN ret_val;

END IS_MASKED;

END;

/

Disclaimer: We hope that the information on these script pages is valuable to you. Your use of the information contained in these pages, however, is at your sole risk. All information on these pages is provided "as -is", without any warranty, whether express or implied, of its accuracy, completeness, or fitness for a particular purpose... Disclaimer Continued


Back to Database Journal Home

[Bookmark][Print] [Close][To Top]
  • Prev Article-Database:

  • Next Article-Database:
  • Related Materias
    No Related FoundDatabase
    Topics
    Photoshop Tutorial
     

    Special Effect

      3D Effect
      Photoshop Articles
    Programming Tutorial
     

    C/C++ Tutorial

      Visual Basic
      C# Tutorial
    Database Tutorial
     

    MySQL Tutorial

      MS SQL Tutorial
      Oracle Tutorial
    Graphic Design Tutorial
     

    Coreldraw Tutorial

      Illustrator Tutorial
      3D Graphics Articles
    Webmaster Articles
     

    Domain Service

      Web Hosting
      Site Promotion
    Java Tutorial&Articles
     

    Java Servlets

      JavaEE Tutorial
     

    JavaBeans Tutorial

    XML Tutorial&Articles
     

    XML Style Tutorial

      AJAX Tutorial
      XML Mobile
    Flash Tutorial&Articles
     

    Flash Video

      Action Script
      Flash Articles
    OS Tutorial&Articles
     

    Linux Tutorial

      Symbian Tutorial
      MacOS Tutorial