在oracle实践学习位运算 第一篇(r4笔记第55天)

时间:2022-05-04
本文章向大家介绍在oracle实践学习位运算 第一篇(r4笔记第55天),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

今天无意中看到了谭浩强先生的<<c程序设计>>这本书,虽然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 二进制的运算都是有一定的实际使用意义的,在后续的博文中继续分享,欢迎关注。