真空女主播新面孔小猪:ORACLE中的BITAND函数
来源:百度文库 编辑:偶看新闻 时间:2024/04/29 12:46:37
ORACLE中的BITAND函数
- 博客分类:
- oracle
http://hi.baidu.com/hihelens/blog/item/42413b2a19f27f28d52af10e.html
bitand ,按位与操作。
select bitand(0,0) from dual --0
select bitand(1,0) from dual --0
select bitand(0,1) from dual --0
select bitand(1,1) from dual --1
另外,oracle本身没有bitor,bitxor函数,但是可以实现和bitand的转换:
BITOR(x,y) = (x + y) - BITAND(x, y)
BITXOR(x,y) = BITOR(x,y) - BITAND(x,y) = (x + y) - BITAND(x, y) * 2
************************************************
http://hi.baidu.com/flydragon1125/blog/item/c8cd247a6fc849e02f73b33b.html
bitand( ) 函数
返回两个数值型数值在按位进行 AND 运算后的结果。
语法
BITAND(nExpression1, nExpression2)
参数
nExpression1, nExpression2
指定按位进行 AND 运算的两个数值。如果 nExpression1 和 nExpression2 为非整数型,那么它们在按位进行 AND 运算之前转换为整数。
返回值类型
数值型
说明
BITAND( ) 将 nExpression1 的每一位同 nExpression2 的相应位进行比较。如果 nExpression1 和 nExpression2 的位都是 1,相应的结果位就是 1;否则相应的结果位是 0。
下表列出对 nExpression1 和 nExpression2 按位进行 AND 运算的结果:
nExpression1 位 nExpression2 位 结果位
0 0 0
0 1 0
1 1 1
1 0 0
bitand( ) 函数示例
x = 5 && 二进制为 0101
y = 6 && 二进制为 0110
bitand(x,y) && 返回值 4,二进制为 0100
-----------------------------------------------------------------------------
ORACLE中的BITOR和BITXOR
ORACLE中只有BITAND而没有BITOR, BITXOR
原因是,有了BITAND, 很容易实现BITOR和BITXOR
BITOR(x,y) = (x + y) - BITAND(x, y);
BITXOR(x,y) = BITOR(x,y) - BITAND(x,y) = (x + y) - BITAND(x, y) * 2;
hextoraw是一个用十六进制转换的函数,所以hextoraw(13)实际是
十六进制:13
十进制:19(16+3)
二进制:10011
hextoraw(2)的二进制为10
所以
select utl_raw.bit_and(hextoraw(13),hextoraw(2)) from dual
=select bitand(19,2) from dual
=(10011) and (10)=(11) and (10)=(10)='02'
注: 根据说明utl_raw.bit_and与bitand的不同是utl_raw.bit_and在将两个数字转换为二进制后,会忽略掉多余的位数.
****************************************************
select BIN_TO_NUM(1,0,1) a,bin_to_num(1,0) b from dual
;
------------利用oracle提供的函数使用方便
select sum(data1)
from (select substr('101', rownum, 1) * power(2, length('101') - rownum) data1
from dual connect by rownum <= length('101'))
-------自己SQL实现,稍微复杂,但是方便之处,只需简单修改,就可以转换成8进制、16进制等
select bitand(7,4) from dual;
/*
111
100
-----
100 = 4
*/
select (7+4-bitand(7,4)) from dual;
/*
111
100
-----
111 = 7
*/
select (7+4-bitand(7,4)*2) from dual;
/*
111
100
-----
011 = 3
*/