位操作

l2g32003 2004-09-16 10:14:04

很久没上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

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
...全文
61 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
l2g32003 2004-09-16
  • 打赏
  • 举报
回复
"请不要发表可能给我们带来伤害的言论,谢谢配合"
------多发个帖就.... 这csdn现在改成什么样了? 唉

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧