Focus On Oracle

Installing, Backup & Recovery, Performance Tuning,
Troubleshooting, Upgrading, Patching

Oracle Engineered System


当前位置: 首页 » 技术文章 » Oracle

C and Oracle

C语言支持以下的位运算
& – Bitwise AND         按位与,都为真才为真
| – Bitwise OR          按位或,只要有一个为真就为真
~ – One’s complement    取反
^ – Bitwise XOR         按位异或,只有一个为假时为真
<< – left shift         左移      大多数情况下可以理解为左移a位就是乘以2^a
>> – right shift        左移      大多数情况下可以理解为右移a位就是除以2^a

这6种运算符中,除了取反~运算符外,其它的都是二目运算符,就是要求运算符两侧各有一个运算量,运算量是整型或者字符型的数据
位运算能干的还挺多,比如swap功能(数值交换),奇偶性判断,左移右移在计算oracle rdba时更方便
#include <stdio.h>
void main()
{
int a=12,b=14;
a^=b;
b^=a;
a^=b;
printf("A=%d,B=%d\n",a,b);

printf("Average is %d\n",(a+b)>>1);

if((a&1)==1)
{
 printf("A is odd\n");
}
else
{
 printf("A is even\n");
}

printf("The int range is %d\n",(1<<31)-1);

int rdba=0xff4062ff;
int file=0x3FF&(rdba>>22);
int block=rdba&0x3FFFFF;
printf("File=%d,Block=%d\n",file,block);
}

Oracle的bitand函数
SQL> select bitand(6,3) from dual;
BITAND(6,3)
-----------
 2

SQL> select bitand(
    bin_to_num(1,1,0),
    bin_to_num(0,1,1)) value
from dual;  2    3    4  
     VALUE
----------
2
SQL>
 

以下引自orafaq
oracle's bitand (most sql implementations use the & operator): 
sql> select bitand(2, 4) from dual;
bitand(2,4)
-----------
          0
A.to simulate bitor (most sql implementations use the | operator): 
create function bitor(x in number, y in number) return number as
begin
    return x + y - bitand(x,y);
end;
/
sql> select bitor(2, 4) from dual;
bitor(2,4)
----------
         6

B.to simulate bitxor (most sql implementations use the ^ operator): 
create function bitxor(x in number, y in number) return number as
begin
    return bitor(x,y) - bitand(x,y);
end;
/ 
sql> select bitxor(2, 4) from dual;
bitxor(2,4)
-----------
          6

C.to simulate bitnot (most sql implementations use the ~ operator): 
create function bitnot(x in number) return number as 
begin
    return (0 - x) - 1;
end;
/


其实utl_raw也包含类似的函数
SQL> desc utl_raw
FUNCTION BIT_AND RETURNS RAW
 Argument Name	Type	In/Out Default?
 ------------------------------ ----------------------- ------ --------
 R1	RAW	IN
 R2	RAW	IN
FUNCTION BIT_COMPLEMENT RETURNS RAW
 Argument Name	Type	In/Out Default?
 ------------------------------ ----------------------- ------ --------
 R	RAW	IN
FUNCTION BIT_OR RETURNS RAW
 Argument Name	Type	In/Out Default?
 ------------------------------ ----------------------- ------ --------
 R1	RAW	IN
 R2	RAW	IN
FUNCTION BIT_XOR RETURNS RAW
 Argument Name	Type	In/Out Default?
 ------------------------------ ----------------------- ------ --------
 R1	RAW	IN
 R2	RAW	IN


Reference
http://www.orafaq.com/wiki/Bit
http://www.thegeekstuff.com/2012/10/bitwise-operators/

关键词:C 

相关文章

Understanding C by learning assembly
Programming in C
boost
cmake(Write once, run everywhere)
C and Oracle
Write in C
Top