在oracle实践学习位运算 第一篇

今天无意中看到了谭浩强先生的>这本书,虽然c语言都是很多年前学过的东西了,但是看起来亲切,实际用起来陌生,很多的概念都已经很模糊了,记得上大学时老师特别推荐的位运算这一部分,自己这次又看了下,还是有一定的收获。
位运算非常的简洁,使用起来看起来很高深,很有专业的味道,经常在一些笔试面试题中出现一些位运算的身影。而且个人觉得位运算确实是比较通用和精华的内容。
位运算是二进制位的运算,c语言提供了位运算的功能,在其它的高级语言(java)中也有实现,还是具有一定的优势的。
c语言中提供的位运算符有
按位与 &   按位或  |   按位异或 ^   
取反   ~     左移 >

这6种运算符中,除了取反~运算符外,其它的都是二目运算符,就是要求运算符两侧各有一个运算量,运算量是整型或者字符型的数据

先来看看按位与,基本的运算规则就是 0&0=0 ,0&1=0 ,1&0=0,1&1=1 因为是二进制的运算,我们转换成二进制的方式来看就比较清楚了。
以3&5为例。
00000011
00000101   &
---------------
00000001
所以3&5按位与的结果就是1,

明白了这些基本内容,我们如果通过c语言,或者java来简单测试是没有问题的,我手头有oracle的环境,那就用oracle来试试。
oracle中对于按位与是通过bitand来实现的。通过字面理解也很容易区别。
SQL> select bitand(3,5) from dual;
BITAND(3,5)
-----------
          1

按位或
按位或的基本运算规则就是   0|0=0, 0|1=1,1|0=1,1|1=1
还是上面相似的例子3|5
00000011
00000101   |
---------------
00000111
所以按位或的结果就是7
当然了在oracle中可没有直接的函数bitor
但是我们可以通过bitand来得到bitor的结果。
基本的公式就是bitor(x,y)=x+y-bitand(x,y)
所以bitor(3,5)=3+5-bitand(3,5)=8-1=7

按位异或
按位异或有时候也叫XOR运算符,它的运算规则是 0^0=0, 0^1=1, 1^0=1, 1^1=0
还是类似的例子。
3^5
00000011
00000101   ^
---------------
00000110

所以按位异或的结果就是6
在oracle中也没有按位异或的函数bitxor,但是可以通过bitand来实现。
bitxor(x,y)=bitor(x,y) - bitand(x,y) = (x + y) - BITAND(x, y) * 2
所以bitxor(3,5)=3+5-2*1=6

说到这三种运算符,在oracle中也有它们的身影。
可以在utl_raw中得到,但是不同之处在于类型是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
举一个例子,还是以3 和 5 为运算量,这个时候需要用到hextoraw这个函数,这个函数是十六进制转换的函数。
所以hextoraw(3)实际是
十六进制:3
十进制:3(3)
二进制:00011
同理,hextoraw(5)的二进制为101
使用utl_raw得到的情况就是
select utl_raw.bit_and(hextoraw(3),hextoraw(5)) from dual
结果类似于使用bitand的结果  select bitand(3,5) from dual

二进制的运算都是有一定的实际使用意义的,在后续的博文中继续分享,欢迎关注。

时间: 2024-09-11 03:40:29

在oracle实践学习位运算 第一篇的相关文章

Oracle数据库学习之第一篇

  权限管理: oracle 9里面默认的三个用户名和密码: sys change_on_install //权限最高的管理员 system manager //普通的管理员 scott tiger //普通用户 在oracle 10中,仍然使用这三个用户作为默认用户.但sys和system用户的密码不再默认.在安装数据库的时候,可以由用户指定 .从安全角度考虑,scott用户默认被锁定,所以要使用该用户,需要先解除锁定. 注意:我们要使用oracle数据库,至少要启动两个服务,一个是监听服务,

oracle中的数组(第一篇)

数组在各种编程语言中都是很重要的数据结构实现,在oracle中也有自己的一席之地.自己简单做了几个实验,发现很多东西还是眼高手低,真实去做的时候,里面还是有不少的细节的. 首先数组大体可以有以下几种. 固定长度的数组 变长数组 多维数组 如果说实现方式,就有varray,嵌套表,record等等.我们从varray来开始. 比如实现一个固定长度的数组.长度为10 SQL> create type varray_type as varray(10) of number(10);   2  / Ty

《Oracle高性能SQL引擎剖析:SQL优化与调优机制详解》一第一篇 执行计划

第一篇 执行计划 执行计划是指示Oracle如何获取和过滤数据.产生最终结果集,是影响SQL语句执行性能的关键因素.我们在深入了解执行计划之前,首先需要知道执行计划是在什么时候产生的,以及如何让SQL引擎为语句生成执行计划. 在深入了解执行计划之前,我们先了解SQL语句的处理执行过程.当一条语句提交到Oracle后,SQL引擎会分为三个步骤对其处理和执行:解析(Parse).执行(Execute)和获取(Fetch),分别由SQL引擎的不同组件完成.SQL引擎的组件如图1-1所示. 1. SQL

探索ORACLE不完全恢复之--基于cancel恢复 第一篇

探索ORACLE不完全恢复之--基于cancel恢复 第一篇 作者:吴伟龙   Name:Prodence Woo QQ:286507175  msn:hapy-wuweilong@hotmail.com 基于cancel的不一致性恢复(归档存在) 第一篇                 基于取消的恢复只适用于以下情况:归档日志丢失导致完全恢复失败:丢失了数据文件和未归档的重做日志(联机重做日志):   1.先关闭数据库,执行一次全库冷备份.   SQL> selectfile_name fro

探索ORACLE不完全恢复之--基于SCN恢复 第一篇

探索ORACLE不完全恢复之--基于时间恢复 作者:吴伟龙   Name:Prodence Woo QQ:286507175  msn:hapy-wuweilong@hotmail.com 基于SCN恢复 第一篇 1.在删除数据之前,察看下SCN号是多少: SQL> col name format a45 SQL> set line 300 SQL> select name,checkpoint_change# from v$datafile_header;   NAME        

c语言中用位运算实现加法技巧介绍_C 语言

用位运算实现加法也就是计算机用二进制进行运算,32位的CPU只能表示32位内的数,这里先用1位数的加法来进行,在不考虑进位的基础上,如下 复制代码 代码如下: 1 + 1 = 0 1 + 0 = 1 0 + 1 = 1 0 + 0 = 0 很明显这几个表达式可以用位运算的"^"来代替,如下 复制代码 代码如下: 1 ^ 1 = 0 1 ^ 0 = 1 0 ^ 1 = 1 0 ^ 0 = 0 这样我们就完成了简单的一位数加法,那么要进行二位的加法,这个方法可行不可行呢?肯定是不行的,矛盾

【书评:Oracle查询优化改写】第一章

[书评:Oracle查询优化改写]第一章     BLOG文档结构图:     之前帮助ITPUB上的一位博主修改过一个很明显的错误,ITPUB为了表达感谢特赠予一本技术方面的书籍,我可以自己选择书名,想了想,自己对SQL优化特感兴趣于是就订了一本SQL优化改写方面的书籍,书名为<Oracle查询优化改写>,其实这本书的作者我是认识的,之前数次在公开课上听过他讲过SQL优化改写方面的内容,印象很深刻,好了,不多说了,说多了有打广告的嫌疑. 最近一直在学习rac方面的内容,但是rac高可用性,这

实用的位运算应用

对于位运算,之前在一篇博文中分享了一下在c语言和oracle中的位运算实现 http://blog.itpub.net/23718752/viewspace-1440273/ 但是关于位运算的实际应用还是有感觉有些空中楼阁,理论提升到一定的高度,但是实际应用无从下手的话,本身没有太大的实际意义. 教科书中有一个章节是关于位运算的应用,但是其中的例子,感觉不是很通俗,整理了一些小例子,感觉还是比较实用的. 1.变量交换 这个例子在笔试面试中可能还会考到,不需要设置临时变量,怎么快速交换两个变量的值

学习动态性能表 第一篇--v$sysstat

  学习动态性能表 第一篇--v$sysstat  按照OracleDocument中的描述,v$sysstat存储自数据库实例运行那刻起就开始累计全实例(instance-wide)的资源使用情况. 类似于v$sesstat,该视图存储下列的统计信息: 1>.事件发生次数的统计(如:user commits) 2>.数据产生,存取或者操作的total列(如:redo size) 3>.如果TIMED_STATISTICS值为true,则统计花费在执行操作上的总时间(如:CPU used