位操作
很久没上csdn来 随便发个帖 其实下面的内容只是我平时使用的笔记 很多来自asktom
bitand works on numbers. It'll not work on RAWS or STRINGS
utl_raw.bitand will work on RAWS.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bitand 按位与 两个相应的位为 1 结果为 1
9.2$lgone@one.lg.ok >select to_bin(6),to_bin(2),bitand(6,2) from dual;
TO_BIN(6) TO_BIN(2) BITAND(6,2)
----------- ----------- ------------
110 10 2
110 -- 这是 bitand(6,2) 中的 6
10 -- 这是 bitand(6,2) 中的 2
010 -- 这就是结果 2
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bitor 按位或 两个相应的位只要一个为 1 结果为 1
(x + y) - BitAND(x, y) 可实现
9.2$lgone@one.lg.ok >select to_bin(12),to_bin(2),to_bin(12+2-bitand(12,2)),
12+2-bitand(12,2) from dual;
TO_BIN(12) TO_BIN(2) TO_BIN(12+2-BITAND(12,2)) 12+2-BITAND(12,2)
---------- ---------- ------------------------- -----------------
1100 10 1110 14
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bitxor 异或 位上的同为0,1 为 0 不同的时候为 1
(x + y) - BitAND(x, y) * 2 或 BitOR(x, y) - BitAND(x, y) 可实现
9.2$lgone@one.lg.ok >select to_bin(11),to_bin(2),to_bin(11+2-bitand(11,2)*2),
11+2-bitand(11,2)*2 from dual;
TO_BIN(11) TO_BIN(2) TO_BIN(11+2-BITAND(11,2)*2) 11+2-BITAND(11,2)*2
---------- ---------- --------------------------- --------------------
1011 10 1001 9
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
UTL_RAW.BIT_AND
UTL_RAW.BIT_OR
UTL_RAW.BIT_XOR
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
多个数值的时候
in 9i we could do a user defined aggregate to to a bitor.
In 8i, we have to "fake it"
ops$tkyte@ORA817DEV> create or replace function set_bitor( p_key in number )
return number
2 as
3 l_bitor number := 0;
4 begin
5 for x in ( select sal from emp where deptno = p_key )
6 loop
7 l_bitor := (l_bitor + x.sal) - bitand( l_bitor, x.sal );
8 end loop;
9 return l_bitor;
10 end;
11 /
Function created.
ops$tkyte@ORA817DEV>
ops$tkyte@ORA817DEV>
ops$tkyte@ORA817DEV> select set_bitor( 10 ) from dual;
SET_BITOR(10)
-------------
8094
ops$tkyte@ORA817DEV> select lpad( to_bin( sal), 32, '0' ) from emp where deptno
= 10;
LPAD(TO_BIN(SAL),32,'0')
--------------------------------
00000000000000000000100110010010
00000000000000000001001110001000
00000000000000000000010100010100
ops$tkyte@ORA817DEV> select to_dec( '1111110011110', 2 ) from dual;
TO_DEC('1111110011110',2)
-------------------------
8094
ops$tkyte@ORA817DEV>
ops$tkyte@ORA817DEV> select deptno, set_bitor( deptno )
2 from ( select distinct deptno from emp )
3 /
DEPTNO SET_BITOR(DEPTNO)
---------- -----------------
10 8094
20 4095
30 4094
ops$tkyte@ORA817DEV>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
utl_raw.bit_and( my_raw_value, hextoraw( rpad('1F',length(my_raw_value),'1F') ) );
that'll ensure that the mask 1f is as long as it needs be and no longer. when
we use length on my_raw_value, my_raw_value will be turned into hex first so
we'll get the right number of 1F's
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~