Database Journal
MS SQL Oracle DB2 Access MySQL PostgreSQL Sybase PHP SQL Etc SQL Scripts & Samples Links Database Forum

» Database Journal Home
» Database Articles
» Database Tutorials
MS SQL
Oracle
DB2
MS Access
MySQL
» RESOURCES
Database Tools
SQL Scripts & Samples
Links
» Database Forum
» Sitemap
Free Newsletters:
DatabaseDaily  
News Via RSS Feed


follow us on Twitter
Database Journal |DBA Support |SQLCourse |SQLCourse2
 

Featured Database Articles

SQL Scripts & Samples

Posted Apr 21, 2008

Bitwise Math and Masking Functions

By DatabaseJournal.com Staff



>>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



SQL Scripts & Samples Archives

Comment and Contribute

 


(Maximum characters: 1200). You have characters left.

 

 




Latest Forum Threads
SQL Scripts & Samples Forum
Topic By Replies Updated
sql help!! add 1 August 22nd, 11:58 AM
How To Combine These 2 Queries into 1 Query ? tarek_land 1 June 7th, 08:37 AM
solving query svibuk 1 February 3rd, 06:08 AM
converting from a character string to uniqueidentifier saturnius 4 January 4th, 05:56 AM