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

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2015-02-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏计算机视觉与深度学习基础

POJ1837

好巧妙的背包 杠杆原理:力臂=力距*力 当平衡时,左右的力臂相同,可以把左边的作为负的,右边的作为正的。 dp[i][j]表示用前i个钩码挂出力臂和为j的情况的...

20890
来自专栏玄魂工作室

如何学Python 第十八课 初见位运算

在上一篇文章里我们介绍了类和面向对象为编程带来的方便。今天我们来说点稍微简单的——位运算。 位运算会用到位运算符。但是我们今天不介绍具体的代码上的操作,而是主要...

29470
来自专栏Jed的技术阶梯

Java设计模式之工厂方法模式

女娲补天的故事大家都听说过吧,今天不说这个,说女娲创造人的故事,可不是“造人”的工作,这个词被现代人滥用了。这个故事是说,女娲在补了天后,下到凡间一看,哇塞,风...

37420
来自专栏写代码的海盗

我们是80后 golang入坑系列

现在这个系列,已经开始两极分化了。 点赞的认为风格轻松,看着不困。反之,就有人嫌写的罗里吧嗦,上纲上线。所以善意提醒,里面不只是技术语言,还有段子。专心看技术的...

35870
来自专栏HansBug's Lab

3404: [Usaco2009 Open]Cow Digit Game又见数字游戏

3404: [Usaco2009 Open]Cow Digit Game又见数字游戏 Time Limit: 3 Sec  Memory Limit: 128 ...

29790
来自专栏owent

打造最快的Hash表(转) [以暴雪的游戏的Hash为例]

先提一个简单的问题,如果有一个庞大的字符串数组,然后给你一个单独的字符串,让你从这个数组中查找是否有这个字符串并找到它,你会怎么做?

17430
来自专栏一个会写诗的程序员的博客

《Kotin 极简教程》第8章 函数式编程(FP)(1)第8章 函数式编程(FP)《Kotlin极简教程》正式上架:

"函数式编程", 又称泛函编程, 是一种"编程范式"(programming paradigm),也就是如何编写程序的方法论。它的基础是 λ 演算(lambda...

12620
来自专栏代码世界

Python之面向对象一

引子 小游戏:人狗大战 角色:人和狗 角色属性:姓名,血量,战斗力和性别(种类) 技能:打/咬 用函数实现人打狗和狗咬人的情形 def Dog(name,blo...

44890
来自专栏aCloudDeveloper

算法导论2-9章补充几道题

本篇博文意在对前几章中遗漏的,本人觉得有意思的习题当独拿出来练练手。 1、习题2-4,求逆序对,时间复杂度要求Θ(nlgn) 定义:对于一个有n个不同的数组A,...

22850
来自专栏小樱的经验随笔

洛谷 P1972 [SDOI2009]HH的项链【莫队算法学习】

P1972 [SDOI2009]HH的项链 题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链。HH 相信不同的贝壳会带来好运,所以每次散步完后,他...

27060

扫码关注云+社区

领取腾讯云代金券