1,需求:
使用PL/SQL实现整数二进制指定位置为0或1,用函数表示:
r = f(src,pos,0_or_1)
r:设置结果
f:实现设置的函数
src:原值
pos:指定位置,取值power(2,x);如1表示二进制倒数第1位,4表示二进制倒数第3位,8表示二进制倒数第4位
o_or_1:设置为0或1,取值0、1
2,实现:
create or replace function setbit01(src in int,pos in int,setbit0_1 in int) return int
as
begin
-- src:需要设置的原始值
-- pos:需要设置的位,应为power(2,x),1,2,4,8
-- setbit0_1:pos对应位置置为0还是1
if setbit0_1 = 0 then
if bitand(src,pos)= 0 then
return src;
else
return src - pos;
end if;
elsif setbit0_1 = 1 then
if bitand(src,pos)= 0 then
return src + pos;
else
return src;
end if;
else
return 0;
end if;
end;
/
3,测试
WITH v AS
(SELECT (CASE
WHEN rownum - 1 = 65 THEN
NULL
ELSE
rownum - 1
END) act_type
FROM dual
CONNECT BY LEVEL <= 66)
SELECT act_type,
setbit01(act_type, 1, 0) AS act_type_1_0,
setbit01(act_type, 1, 1) AS act_type_1_1,
setbit01(act_type, 2, 0) AS act_type_2_0,
setbit01(act_type, 2, 1) AS act_type_2_1,
setbit01(act_type, 4, 0) AS act_type_4_0,
setbit01(act_type, 4, 1) AS act_type_4_1
FROM v
ORDER BY 1;
SELECT setbit01(NULL, 1, 1) FROM dual;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/18922393/viewspace-730101/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/18922393/viewspace-730101/