because Intel uses big-endian and the HEX function dumps the internal representation on SMALLINT and
Also note that in order to access the highest bit you must use negative numbers since two-s complement is being used.
But enough said. Let be introduce the individual function which DB2 provides built-in as well as a set of function I have written to complement the library. You can find the source code for those at the end of this post.
In addition to to these built-in functions I have defined the following functions at the end for usability:
--Execute with "db2 -tvf <thisfile>"
CREATE OR REPLACE FUNCTION BITSET(vector DECFLOAT(34), pos INTEGER)
RETURNS DECFLOAT(34)
SPECIFIC BITSET_DECFLOAT
DETERMINISTIC NO EXTERNAL ACTION CONTAINS SQL
RETURN CASE WHEN pos BETWEEN 1 AND 112
THEN BITOR(vector, POWER(CAST(2 AS DECFLOAT(34)), pos - 1))
WHEN pos = 113
THEN BITOR(vector, DECFLOAT('-5192296858534827628530496329220096'))
WHEN pos IS NULL THEN NULL
ELSE RAISE_ERROR('78000', 'Bit must be: 1..113 or NULL')
END;
CREATE OR REPLACE FUNCTION BITCLEAR(vector DECFLOAT(34), pos INTEGER)
RETURNS DECFLOAT(34)
SPECIFIC BITCLEAR_DECFLOAT
DETERMINISTIC NO EXTERNAL ACTION CONTAINS SQL
RETURN CASE WHEN pos BETWEEN 1 AND 112
THEN BITANDNOT(vector, POWER(CAST(2 AS DECFLOAT(34)), pos - 1))
WHEN pos = 113
THEN BITANDNOT(vector, DECFLOAT('-5192296858534827628530496329220096'))
WHEN pos IS NULL THEN NULL
ELSE RAISE_ERROR('78000', 'Bit must be: 1..113 or NULL')
END;
CREATE OR REPLACE FUNCTION BITTEST(vector DECFLOAT(34), pos INTEGER)
RETURNS INTEGER
SPECIFIC BITTEST_DECFLOAT
DETERMINISTIC NO EXTERNAL ACTION CONTAINS SQL
RETURN CASE WHEN pos IS NULL
THEN NULL
WHEN pos BETWEEN 1 AND 112
THEN CASE WHEN BITAND(vector, POWER(CAST(2 AS DECFLOAT(34)), pos - 1)) != 0
THEN 1 ELSE 0 END
WHEN pos = 113
THEN CASE WHEN BITAND(vector, DECFLOAT('-5192296858534827628530496329220096')) != 0
THEN 1 ELSE 0 END
ELSE RAISE_ERROR('78000', 'Bit must be: 1..113 or NULL')
END;
CREATE OR REPLACE FUNCTION BITSET(vector BIGINT, pos INTEGER)
RETURNS BIGINT
SPECIFIC BITSET_BIGINT
DETERMINISTIC NO EXTERNAL ACTION CONTAINS SQL
RETURN CASE WHEN pos BETWEEN 1 AND 63
THEN BITOR(vector, POWER(CAST(2 AS BIGINT), pos - 1))
WHEN pos = 64
THEN BITOR(vector, -9223372036854775808)
WHEN pos IS NULL THEN NULL
ELSE RAISE_ERROR('78000', 'Bit must be: 1..64 or NULL')
END;
CREATE OR REPLACE FUNCTION BITCLEAR(vector BIGINT, pos INTEGER)
RETURNS BIGINT
SPECIFIC BITCLEAR_BIGINT
DETERMINISTIC NO EXTERNAL ACTION CONTAINS SQL
RETURN CASE WHEN pos BETWEEN 1 AND 63
THEN BITANDNOT(vector, POWER(CAST(2 AS BIGINT), pos - 1))
WHEN pos = 64
THEN BITANDNOT(vector, -9223372036854775808)
WHEN pos IS NULL THEN NULL
ELSE RAISE_ERROR('78000', 'Bit must be: 1..64 or NULL')
END;
CREATE OR REPLACE FUNCTION BITTEST(vector BIGINT, pos INTEGER)
RETURNS INTEGER
SPECIFIC BITTEST_BIGINT
DETERMINISTIC NO EXTERNAL ACTION CONTAINS SQL
RETURN CASE WHEN pos IS NULL
THEN NULL
WHEN pos BETWEEN 1 AND 63
THEN CASE WHEN BITAND(vector, POWER(CAST(2 AS BIGINT), pos - 1)) != 0
THEN 1 ELSE 0 END
WHEN pos = 64
THEN CASE WHEN BITAND(vector, -9223372036854775808) != 0
THEN 1 ELSE 0 END
ELSE RAISE_ERROR('78000', 'Bit must be: 1..64 or NULL')
END;
CREATE OR REPLACE FUNCTION BITSET(vector INTEGER, pos INTEGER)
RETURNS INTEGER
SPECIFIC BITSET_INTEGER
DETERMINISTIC NO EXTERNAL ACTION CONTAINS SQL
RETURN CASE WHEN pos BETWEEN 1 AND 31
THEN BITOR(vector, POWER(CAST(2 AS INTEGER), pos - 1))
WHEN pos = 32
THEN BITOR(vector, -2147483648)
WHEN pos IS NULL THEN NULL
ELSE RAISE_ERROR('78000', 'Bit must be: 1..32 or NULL')
END;
CREATE OR REPLACE FUNCTION BITCLEAR(vector INTEGER, pos INTEGER)
RETURNS INTEGER
SPECIFIC BITCLEAR_INTEGER
DETERMINISTIC NO EXTERNAL ACTION CONTAINS SQL
RETURN CASE WHEN pos BETWEEN 1 AND 31
THEN BITANDNOT(vector, POWER(CAST(2 AS INTEGER), pos - 1))
WHEN pos = 32
THEN BITANDNOT(vector, -2147483648)
WHEN pos IS NULL THEN NULL
ELSE RAISE_ERROR('78000', 'Bit must be: 1..32 or NULL')
END;
CREATE OR REPLACE FUNCTION BITTEST(vector INTEGER, pos INTEGER)
RETURNS INTEGER
SPECIFIC BITTEST_INTEGER
DETERMINISTIC NO EXTERNAL ACTION CONTAINS SQL
RETURN CASE WHEN pos IS NULL
THEN NULL
WHEN pos BETWEEN 1 AND 31
THEN CASE WHEN BITAND(vector, POWER(CAST(2 AS INTEGER), pos - 1)) != 0
THEN 1 ELSE 0 END
WHEN pos = 32
THEN CASE WHEN BITAND(vector, -2147483648) != 0
THEN 1 ELSE 0 END
ELSE RAISE_ERROR('78000', 'Bit must be: 1..32 or NULL')
END;
CREATE OR REPLACE FUNCTION BITSET(vector SMALLINT, pos INTEGER)
RETURNS SMALLINT
SPECIFIC BITSET_SMALLINT
DETERMINISTIC NO EXTERNAL ACTION CONTAINS SQL
RETURN CASE WHEN pos BETWEEN 1 AND 15
THEN BITOR(vector, SMALLINT(POWER(CAST(2 AS INTEGER), pos - 1)))
WHEN pos = 16
THEN BITOR(vector, -32768)
WHEN pos IS NULL THEN NULL
ELSE RAISE_ERROR('78000', 'Bit must be: 1..16 or NULL')
END;
CREATE OR REPLACE FUNCTION BITCLEAR(vector SMALLINT, pos INTEGER)
RETURNS SMALLINT
SPECIFIC BITCLEAR_SMALLINT
DETERMINISTIC NO EXTERNAL ACTION CONTAINS SQL
RETURN CASE WHEN pos BETWEEN 1 AND 15
THEN BITANDNOT(vector, SMALLINT(POWER(CAST(2 AS INTEGER), pos - 1)))
WHEN pos = 16
THEN BITANDNOT(vector, -32768)
WHEN pos IS NULL THEN NULL
ELSE RAISE_ERROR('78000', 'Bit must be: 1..16 or NULL')
END;
CREATE OR REPLACE FUNCTION BITTEST(vector SMALLINT, pos INTEGER)
RETURNS INTEGER
SPECIFIC BITTEST_SMALLINT
DETERMINISTIC NO EXTERNAL ACTION CONTAINS SQL
RETURN CASE WHEN pos IS NULL
THEN NULL
WHEN pos BETWEEN 1 AND 15
THEN CASE WHEN BITAND(vector, SMALLINT(POWER(CAST(2 AS INTEGER), pos - 1))) != 0
THEN 1 ELSE 0 END
WHEN pos = 16
THEN CASE WHEN BITAND(vector, -32768) != 0
THEN 1 ELSE 0 END
ELSE RAISE_ERROR('78000', 'Bit must be: 1..16 or NULL')
END;
--#SET TERMINATOR @
CREATE OR REPLACE FUNCTION BIN2DECFLOAT(str VARCHAR(113))
RETURNS DECFLOAT(34)
SPECIFIC BIN2DECFLOAT
DETERMINISTIC NO EXTERNAL ACTION CONTAINS SQL
BEGIN ATOMIC
DECLARE res DECFLOAT(34) DEFAULT 0;
DECLARE pos INTEGER DEFAULT 1;
WHILE pos <= LENGTH(str) DO
SET res = BITOR(CASE WHEN BITAND(res, DECFLOAT('2596148429267413814265248164610048')) != 0
THEN BITOR(2 * BITANDNOT(res, DECFLOAT('2596148429267413814265248164610048')),
DECFLOAT('-5192296858534827628530496329220096'))
ELSE 2 * res END,
CASE WHEN SUBSTR(str, pos, 1) = '1' THEN 1
WHEN SUBSTR(str, pos, 1) = '0' THEN 0
ELSE RAISE_ERROR('78000', 'Not a binary string')
END),
pos = pos + 1;
END WHILE;
RETURN res;
END
@
--#SET TERMINATOR ;
--#SET TERMINATOR @
CREATE OR REPLACE FUNCTION BIN2BIGINT(str VARCHAR(64))
RETURNS BIGINT
SPECIFIC BIN2BIGINT
DETERMINISTIC NO EXTERNAL ACTION CONTAINS SQL
BEGIN ATOMIC
DECLARE res BIGINT DEFAULT 0;
DECLARE pos INTEGER DEFAULT 1;
WHILE pos <= LENGTH(str) DO
SET res = BITOR(CASE WHEN BITAND(res, 4611686018427387904) != 0
THEN BITOR(2 * BITANDNOT(res, 4611686018427387904),
-9223372036854775808)
ELSE 2 * res END,
CASE WHEN SUBSTR(str, pos, 1) = '1' THEN 1
WHEN SUBSTR(str, pos, 1) = '0' THEN 0
ELSE RAISE_ERROR('78000', 'Not a binary string')
END),
pos = pos + 1;
END WHILE;
RETURN res;
END
@
--#SET TERMINATOR ;
--#SET TERMINATOR @
CREATE OR REPLACE FUNCTION BIN2INT(str VARCHAR(32))
RETURNS INTEGER
SPECIFIC BIN2INT
DETERMINISTIC NO EXTERNAL ACTION CONTAINS SQL
BEGIN ATOMIC
DECLARE res INTEGER DEFAULT 0;
DECLARE pos INTEGER DEFAULT 1;
WHILE pos <= LENGTH(str) DO
SET res = BITOR(CASE WHEN BITAND(res, 1073741824) != 0
THEN BITOR(2 * BITANDNOT(res, 1073741824),
-2147483648)
ELSE 2 * res END,
CASE WHEN SUBSTR(str, pos, 1) = '1' THEN 1
WHEN SUBSTR(str, pos, 1) = '0' THEN 0
ELSE RAISE_ERROR('78000', 'Not a binary string')
END),
pos = pos + 1;
END WHILE;
RETURN res;
END
@
--#SET TERMINATOR ;
--#SET TERMINATOR @
CREATE OR REPLACE FUNCTION BIN2SMALLINT(str VARCHAR(16))
RETURNS SMALLINT
SPECIFIC BIN2SMALLINT
DETERMINISTIC NO EXTERNAL ACTION CONTAINS SQL
BEGIN ATOMIC
DECLARE res INTEGER DEFAULT 0;
DECLARE pos INTEGER DEFAULT 1;
WHILE pos <= LENGTH(str) DO
SET res = BITOR(CASE WHEN BITAND(res, 16384) != 0
THEN BITOR(2 * BITANDNOT(res, 16384),
-32768)
ELSE 2 * res END,
CASE WHEN SUBSTR(str, pos, 1) = '1' THEN 1
WHEN SUBSTR(str, pos, 1) = '0' THEN 0
ELSE RAISE_ERROR('78000', 'Not a binary string')
END),
pos = pos + 1;
END WHILE;
RETURN res;
END
@
--#SET TERMINATOR ;
--#SET TERMINATOR @
CREATE OR REPLACE FUNCTION HEX2DECFLOAT(str VARCHAR(29))
RETURNS DECFLOAT(34)
SPECIFIC HEX2DECFLOAT
DETERMINISTIC NO EXTERNAL ACTION CONTAINS SQL
BEGIN ATOMIC
DECLARE res DECFLOAT DEFAULT 0;
DECLARE pos INTEGER DEFAULT 1;
DECLARE nibble CHAR(1);
WHILE pos <= LENGTH(str) DO
SET nibble = SUBSTR(str, pos, 1);
SET res = BITOR(CASE WHEN BITAND(res, DECFLOAT('324518553658426726783156020576256')) != 0
THEN BITOR(16 * BITANDNOT(res, DECFLOAT('324518553658426726783156020576256')),
DECFLOAT('-5192296858534827628530496329220096'))
ELSE 16 * res END,
CASE nibble
WHEN '0' THEN 0
WHEN '1' THEN 1
WHEN '2' THEN 2
WHEN '3' THEN 3
WHEN '4' THEN 4
WHEN '5' THEN 5
WHEN '6' THEN 6
WHEN '7' THEN 7
WHEN '8' THEN 8
WHEN '9' THEN 9
WHEN 'A' THEN 10
WHEN 'a' THEN 10
WHEN 'B' THEN 11
WHEN 'b' THEN 11
WHEN 'C' THEN 12
WHEN 'c' THEN 12
WHEN 'D' THEN 13
WHEN 'd' THEN 13
WHEN 'E' THEN 14
WHEN 'e' THEN 14
WHEN 'F' THEN 15
WHEN 'f' THEN 15
ELSE RAISE_ERROR('78000', 'Not a hex string')
END),
pos = pos + 1;
END WHILE;
RETURN res;
END
@
--#SET TERMINATOR ;
--#SET TERMINATOR @
CREATE OR REPLACE FUNCTION HEX2BIGINT(str VARCHAR(16))
RETURNS BIGINT
SPECIFIC HEX2BIGINT
DETERMINISTIC NO EXTERNAL ACTION CONTAINS SQL
BEGIN ATOMIC
DECLARE res BIGINT DEFAULT 0;
DECLARE pos INTEGER DEFAULT 1;
DECLARE nibble CHAR(1);
WHILE pos <= LENGTH(str) DO
SET nibble = SUBSTR(str, pos, 1);
SET res = BITOR(CASE WHEN BITAND(res, 576460752303423488) != 0
THEN BITOR(16 * BITANDNOT(res, 576460752303423488),
-9223372036854775808)
ELSE 16 * res END,
CASE nibble
WHEN '0' THEN 0
WHEN '1' THEN 1
WHEN '2' THEN 2
WHEN '3' THEN 3
WHEN '4' THEN 4
WHEN '5' THEN 5
WHEN '6' THEN 6
WHEN '7' THEN 7
WHEN '8' THEN 8
WHEN '9' THEN 9
WHEN 'A' THEN 10
WHEN 'a' THEN 10
WHEN 'B' THEN 11
WHEN 'b' THEN 11
WHEN 'C' THEN 12
WHEN 'c' THEN 12
WHEN 'D' THEN 13
WHEN 'd' THEN 13
WHEN 'E' THEN 14
WHEN 'e' THEN 14
WHEN 'F' THEN 15
WHEN 'f' THEN 15
ELSE RAISE_ERROR('78000', 'Not a hex string')
END),
pos = pos + 1;
END WHILE;
RETURN res;
END
@
--#SET TERMINATOR ;
--#SET TERMINATOR @
CREATE OR REPLACE FUNCTION HEX2INT(str VARCHAR(8))
RETURNS INTEGER
SPECIFIC HEX2INT
DETERMINISTIC NO EXTERNAL ACTION CONTAINS SQL
BEGIN ATOMIC
DECLARE res INTEGER DEFAULT 0;
DECLARE pos INTEGER DEFAULT 1;
DECLARE nibble CHAR(1);
WHILE pos <= LENGTH(str) DO
SET nibble = SUBSTR(str, pos, 1);
SET res = BITOR(CASE WHEN BITAND(res, 134217728) != 0
THEN BITOR(16 * BITANDNOT(res, 134217728),
-2147483648)
ELSE 16 * res END,
CASE nibble
WHEN '0' THEN 0
WHEN '1' THEN 1
WHEN '2' THEN 2
WHEN '3' THEN 3
WHEN '4' THEN 4
WHEN '5' THEN 5
WHEN '6' THEN 6
WHEN '7' THEN 7
WHEN '8' THEN 8
WHEN '9' THEN 9
WHEN 'A' THEN 10
WHEN 'a' THEN 10
WHEN 'B' THEN 11
WHEN 'b' THEN 11
WHEN 'C' THEN 12
WHEN 'c' THEN 12
WHEN 'D' THEN 13
WHEN 'd' THEN 13
WHEN 'E' THEN 14
WHEN 'e' THEN 14
WHEN 'F' THEN 15
WHEN 'f' THEN 15
ELSE RAISE_ERROR('78000', 'Not a hex string')
END),
pos = pos + 1;
END WHILE;
RETURN res;
END
@
--#SET TERMINATOR ;
--#SET TERMINATOR @
CREATE OR REPLACE FUNCTION HEX2SMALLINT(str VARCHAR(4))
RETURNS INTEGER
SPECIFIC HEX2SMALLINT
DETERMINISTIC NO EXTERNAL ACTION CONTAINS SQL
BEGIN ATOMIC
DECLARE res SMALLINT DEFAULT 0;
DECLARE pos INTEGER DEFAULT 1;
DECLARE nibble CHAR(1);
WHILE pos <= LENGTH(str) DO
SET nibble = SUBSTR(str, pos, 1);
SET res = BITOR(CASE WHEN BITAND(res, 2048) != 0
THEN BITOR(16 * BITANDNOT(res, 2048),
-32768)
ELSE 16 * res END,
CASE nibble
WHEN '0' THEN 0
WHEN '1' THEN 1
WHEN '2' THEN 2
WHEN '3' THEN 3
WHEN '4' THEN 4
WHEN '5' THEN 5
WHEN '6' THEN 6
WHEN '7' THEN 7
WHEN '8' THEN 8
WHEN '9' THEN 9
WHEN 'A' THEN 10
WHEN 'a' THEN 10
WHEN 'B' THEN 11
WHEN 'b' THEN 11
WHEN 'C' THEN 12
WHEN 'c' THEN 12
WHEN 'D' THEN 13
WHEN 'd' THEN 13
WHEN 'E' THEN 14
WHEN 'e' THEN 14
WHEN 'F' THEN 15
WHEN 'f' THEN 15
ELSE RAISE_ERROR('78000', 'Not a hex string')
END),
pos = pos + 1;
END WHILE;
RETURN res;
END
@
--#SET TERMINATOR ;
--#SET TERMINATOR @
CREATE OR REPLACE FUNCTION DECFLOAT2BIN(vector DECFLOAT(34))
RETURNS VARCHAR(113)
SPECIFIC DECFLOAT2BIN
DETERMINISTIC NO EXTERNAL ACTION CONTAINS SQL
BEGIN ATOMIC
DECLARE res VARCHAR(114) DEFAULT '0';
DECLARE vec DECFLOAT(34);
SET vec = VECTOR;
WHILE (vec < 0 OR vec >= 1) AND vector IS NOT NULL DO
SET res = CASE WHEN BITAND(vec, 1) = 1 THEN '1' ELSE '0' END || res,
vec = CASE WHEN vec < 0
THEN BITOR((BITANDNOT(vec,
DECFLOAT('-5192296858534827628530496329220096'))
- BITAND(vec, 1) ) / 2,
DECFLOAT('2596148429267413814265248164610048'))
ELSE (vec - BITAND(vec, 1)) / 2 END;
END WHILE;
RETURN CASE WHEN vector IS NULL THEN NULL
WHEN LENGTH(res) > 1 THEN SUBSTR(res, 1, LENGTH(res) - 1)
ELSE '0' END;
END
@
--#SET TERMINATOR ;
--#SET TERMINATOR @
CREATE OR REPLACE FUNCTION BIGINT2BIN(vector BIGINT)
RETURNS VARCHAR(64)
SPECIFIC BIGINT2BIN
DETERMINISTIC NO EXTERNAL ACTION CONTAINS SQL
BEGIN ATOMIC
DECLARE res VARCHAR(65) DEFAULT '0';
DECLARE vec BIGINT;
SET vec = vector;
WHILE (vec < 0 OR vec >= 1) AND vector IS NOT NULL DO
SET res = CASE WHEN BITAND(vec, 1) = 1 THEN '1' ELSE '0' END || res,
vec = CASE WHEN vec < 0
THEN BITOR(BITANDNOT(vec,
-9223372036854775808) / 2,
4611686018427387904)
ELSE vec / 2 END;
END WHILE;
RETURN CASE WHEN vector IS NULL THEN NULL
WHEN LENGTH(res) > 1 THEN SUBSTR(res, 1, LENGTH(res) - 1)
ELSE '0' END;
END
@
--#SET TERMINATOR ;
--#SET TERMINATOR @
CREATE OR REPLACE FUNCTION INT2BIN(vector INTEGER)
RETURNS VARCHAR(32)
SPECIFIC INT2BIN
DETERMINISTIC NO EXTERNAL ACTION CONTAINS SQL
BEGIN ATOMIC
DECLARE res VARCHAR(33) DEFAULT '0';
DECLARE vec INTEGER;
SET vec = vector;
WHILE (vec < 0 OR vec >= 1) AND vector IS NOT NULL DO
SET res = CASE WHEN BITAND(vec, 1) = 1 THEN '1' ELSE '0' END || res,
vec = CASE WHEN vec < 0
THEN BITOR(BITANDNOT(vec,
-2147483648) / 2,
1073741824)
ELSE vec / 2 END;
END WHILE;
RETURN CASE WHEN vector IS NULL THEN NULL
WHEN LENGTH(res) > 1 THEN SUBSTR(res, 1, LENGTH(res) - 1)
ELSE '0' END;
END
@
--#SET TERMINATOR ;
--#SET TERMINATOR @
CREATE OR REPLACE FUNCTION SMALLINT2BIN(vector SMALLINT)
RETURNS VARCHAR(16)
SPECIFIC SMALLINT2BIN
DETERMINISTIC NO EXTERNAL ACTION CONTAINS SQL
BEGIN ATOMIC
DECLARE res VARCHAR(17) DEFAULT '0';
DECLARE vec SMALLINT;
SET vec = vector;
WHILE (vec < 0 OR vec >= 1) AND vector IS NOT NULL DO
SET res = CASE WHEN BITAND(vec, 1) = 1 THEN '1' ELSE '0' END || res,
vec = CASE WHEN vec < 0
THEN BITOR(BITANDNOT(vec,
-32768) / 2,
16384)
ELSE vec / 2 END;
END WHILE;
RETURN CASE WHEN vector IS NULL THEN NULL
WHEN LENGTH(res) > 1 THEN SUBSTR(res, 1, LENGTH(res) - 1)
ELSE '0' END;
END
@
--#SET TERMINATOR ;
--#SET TERMINATOR @
CREATE OR REPLACE FUNCTION DECFLOAT2HEX(vector DECFLOAT(34))
RETURNS VARCHAR(29)
SPECIFIC DECFLOAT2HEX
DETERMINISTIC NO EXTERNAL ACTION CONTAINS SQL
BEGIN ATOMIC
DECLARE res VARCHAR(30) DEFAULT '0';
DECLARE vec DECFLOAT(34);
DECLARE nibble INTEGER;
SET vec = vector;
WHILE (vec < 0 OR vec >= 1) AND vector IS NOT NULL DO
SET nibble = INTEGER(BITAND(vec, 15));
SET res = CASE nibble WHEN 0 THEN '0'
WHEN 1 THEN '1'
WHEN 2 THEN '2'
WHEN 3 THEN '3'
WHEN 4 THEN '4'
WHEN 5 THEN '5'
WHEN 6 THEN '6'
WHEN 7 THEN '7'
WHEN 8 THEN '8'
WHEN 9 THEN '9'
WHEN 10 THEN 'A'
WHEN 11 THEN 'B'
WHEN 12 THEN 'C'
WHEN 13 THEN 'D'
WHEN 14 THEN 'E'
ELSE 'F' END || res,
vec = CASE WHEN vec < 0
THEN BITOR((BITANDNOT(vec,
DECFLOAT('-5192296858534827628530496329220096'))
- nibble) / 16,
DECFLOAT('324518553658426726783156020576256'))
ELSE BITANDNOT(vec, 15) / 16 END;
END WHILE;
RETURN CASE WHEN vector IS NULL THEN NULL
WHEN LENGTH(res) > 1 THEN SUBSTR(res, 1, LENGTH(res) - 1)
ELSE '0' END;
END
@
--#SET TERMINATOR ;
--#SET TERMINATOR @
CREATE OR REPLACE FUNCTION BIGINT2HEX(vector BIGINT)
RETURNS VARCHAR(16)
SPECIFIC BIGINT2HEX
DETERMINISTIC NO EXTERNAL ACTION CONTAINS SQL
BEGIN ATOMIC
DECLARE res VARCHAR(17) DEFAULT '0';
DECLARE vec BIGINT;
DECLARE nibble INTEGER;
SET vec = vector;
WHILE (vec < 0 OR vec >= 1) AND vector IS NOT NULL DO
SET nibble = INTEGER(BITAND(vec, 15));
SET res = CASE nibble WHEN 0 THEN '0'
WHEN 1 THEN '1'
WHEN 2 THEN '2'
WHEN 3 THEN '3'
WHEN 4 THEN '4'
WHEN 5 THEN '5'
WHEN 6 THEN '6'
WHEN 7 THEN '7'
WHEN 8 THEN '8'
WHEN 9 THEN '9'
WHEN 10 THEN 'A'
WHEN 11 THEN 'B'
WHEN 12 THEN 'C'
WHEN 13 THEN 'D'
WHEN 14 THEN 'E'
ELSE 'F' END || res,
vec = CASE WHEN vec < 0
THEN BITOR(BITANDNOT(vec,
-9223372036854775808) / 16,
576460752303423488)
ELSE vec / 16 END;
END WHILE;
RETURN CASE WHEN vector IS NULL THEN NULL
WHEN LENGTH(res) > 1 THEN SUBSTR(res, 1, LENGTH(res) - 1)
ELSE '0' END;
END
@
--#SET TERMINATOR ;
--#SET TERMINATOR @
CREATE OR REPLACE FUNCTION INT2HEX(vector INTEGER)
RETURNS VARCHAR(8)
SPECIFIC INT2HEX
DETERMINISTIC NO EXTERNAL ACTION CONTAINS SQL
BEGIN ATOMIC
DECLARE res VARCHAR(9) DEFAULT '0';
DECLARE vec INTEGER;
DECLARE nibble INTEGER;
SET vec = vector;
WHILE (vec < 0 OR vec >= 1) AND vector IS NOT NULL DO
SET nibble = INTEGER(BITAND(vec, 15));
SET res = CASE nibble WHEN 0 THEN '0'
WHEN 1 THEN '1'
WHEN 2 THEN '2'
WHEN 3 THEN '3'
WHEN 4 THEN '4'
WHEN 5 THEN '5'
WHEN 6 THEN '6'
WHEN 7 THEN '7'
WHEN 8 THEN '8'
WHEN 9 THEN '9'
WHEN 10 THEN 'A'
WHEN 11 THEN 'B'
WHEN 12 THEN 'C'
WHEN 13 THEN 'D'
WHEN 14 THEN 'E'
ELSE 'F' END || res,
vec = CASE WHEN vec < 0
THEN BITOR(BITANDNOT(vec,
-2147483648) / 16,
134217728)
ELSE vec / 16 END;
END WHILE;
RETURN CASE WHEN vector IS NULL THEN NULL
WHEN LENGTH(res) > 1 THEN SUBSTR(res, 1, LENGTH(res) - 1)
ELSE '0' END;
END
@
--#SET TERMINATOR ;
--#SET TERMINATOR @
CREATE OR REPLACE FUNCTION SMALLINT2HEX(vector SMALLINT)
RETURNS VARCHAR(4)
SPECIFIC SMALLINT2HEX
DETERMINISTIC NO EXTERNAL ACTION CONTAINS SQL
BEGIN ATOMIC
DECLARE res VARCHAR(5) DEFAULT '0';
DECLARE vec SMALLINT;
DECLARE nibble INTEGER;
SET vec = vector;
WHILE (vec < 0 OR vec >= 1) AND vector IS NOT NULL DO
SET nibble = INTEGER(BITAND(vec, 15));
SET res = CASE nibble WHEN 0 THEN '0'
WHEN 1 THEN '1'
WHEN 2 THEN '2'
WHEN 3 THEN '3'
WHEN 4 THEN '4'
WHEN 5 THEN '5'
WHEN 6 THEN '6'
WHEN 7 THEN '7'
WHEN 8 THEN '8'
WHEN 9 THEN '9'
WHEN 10 THEN 'A'
WHEN 11 THEN 'B'
WHEN 12 THEN 'C'
WHEN 13 THEN 'D'
WHEN 14 THEN 'E'
ELSE 'F' END || res,
vec = CASE WHEN vec < 0
THEN BITOR(BITANDNOT(vec,
-32768) / 16,
2048)
ELSE vec / 16 END;
END WHILE;
RETURN CASE WHEN vector IS NULL THEN NULL
WHEN LENGTH(res) > 1 THEN SUBSTR(res, 1, LENGTH(res) - 1)
ELSE '0' END;
END
@
--#SET TERMINATOR ;