关于位运算以前接触得不多,对里面补码运算的一些式子看得我一头雾水.今天花了点时间,自己把那些公式全部推导一遍,顿时觉得心中明了很多.希望本文能给有意学习位运算的同学带来帮助

首先开始说之前,先约定好一些运算符号的意义.

~:取反 &:与 |:或 -:负 ^:异或

约定好了操作符之后我们来看最简单的例子, -a = ~a + 1,这个想必不需要解释了吧,由此我们通过简单的移动可以得到 ~a = -(a + 1)

- ~ a = a + 1 等.这里很简单,但是复杂的东西都是由很多简单的东西组成的.

现在来个抽象一点的 a + b = (a & b) + (a | b);这个式子很容易记,但是却不是很容易理解.我最开始看的时候也是不怎么理解.先别纠结与刚才的式子, 先来看另外两个式子 ①a + b = 2(a & b) + (a ^ b) ② a | b = a & b + a ^ b;这两个式子都是成立的,由① ②是不是一眼就能看出来a + b = (a & b) + (a | b)哈...那① ②由各自是什么含义呢.其实很简单的.

首先对于①:异或具有不同为1相同为0的性质,这一特性我们可以将其当做不进位的加法的情况.举一个简单的例子

11010101

^01001101

--------------

10011000 看到没有0+0=0 0+1=1 1+1=0(忽略掉所有进位情况),a^b 计算的是a + b不进位的情况,那么我们要计算a + b的结果自然要把我们的进位给补回来,而(a & b)*2这里做的就是这件事,给我们的a ^ b补偿进位. 与运算是一一得一,一零得一,零零得零(相同不变,不同为零).那我们两个数想与,是不是等价于把两个数相同位置上都是1的情况记录下来,其他位置都设为0,那这样我们是不是就等于记录下了哪一位会产生进位咯,(相同位置为1,相加肯定会出现进位) ,那我们对a&b的结果乘以2,就相当于将结果左移一位,那我们要补偿的进位就放对地方了.这里的位移就比如,个位相加产生的进位要加在十位上. 自此对于a + b = 2(a & b) + (a ^ b)应该没有什么疑惑了吧

现在我们再来分析 ②,我们知道或运算是一一得一,一零得一,零零得零.那换而言之就是相同的不变,(11得1, 00得0)不同的置为一(01得1,10得1) 或运算之后有两种情况都会使值变为1,一种是一个操作数是0另外一个操作数是1,一种是两个都是1. 那我们再来看一下a & b 和a ^ b, a & b是两个都是1结果为1,异或的时候一个操作数是0,另外一个操作数是1,结果为1. 这样一看,或的情况就等于异或的情况加上与的情况.

由此得 a | b = a & b + a ^ b,明白了① ②那么a + b = (a & b) + (a | b);是不是就很好理解了?

其实可以从另外一方面来理解a + b = (a & b) + (a | b);这个式子的,

对于a 和 b的每一位,现在假设a和b的值一个是0一个是1,那么这个时候

a & b = 0,a | b = 1(只考虑一位的前提)

a & b + a ^ b = 0 + 1 = a + b....

同理的我们可以假设a的某一位为1,b的对应位上为1那么这个时候

a & b = 1, a | b = 1;

a & b + a ^ b = 1 + 1 = a + b (只考虑一位)

那么相同的,我们还可以假设a的某一位为0,b的对应位上为0,同理

a & b = 0, a | b = 0;

a & b + a ^ b = 0 + 0 = a + b

补充一句,a + b 还能由刚才推导出来的两个式子继续推导出其他的式子.只不过其他式子在对式子本身意义的理解上没有前面两个式子容易所以在这里就不列举出来了

刚才推导的是a + b的,现在来个a - b = (x | ~y) - (~x | y);这个式子的推导最简单的就是把-b 写成 + (-b)带入式子a + b = (a & b) + (a | b),这里要注意 - b = ~ b + 1;其实这个是一个相当简单的推导,但是很可悲的是,网上广泛流传的是a - b = (x | ~y) - (~x & y); 真是禁不住觉得悲哀,copy别人的东西自己也不会思考过......真是很纯粹的抄袭....一人错百人跟着错(a - b = (x | ~y) - (~x & y)与我们之前推导出来的式子又可以推导出很多式子......这里不一一列举和推导)

其实a + b和a - b都挺容易理解的现在来一个也是很简单的 a | b = (a & ~b) + b = (b & ~a) + a 这个式子,咋一看也许会很难理解,但是实际上真的很简单.还记得a | b = a & b + a ^ b吧,由或运算的性质,我们知道两个数做或运算之后,结果里面的1个个数多半会增多(是多半不是绝对).

举个简单的例子 拿425来或上109(我和某人的生日.....顺便提醒一下子程君....你手柄太多了......施舍一个战戟2给我吧)425二进制是

110101001, 而109的二进制是1101101现在我们来做或运算

110101001

|001101101

----------------

111101101 111101101这个二进制1,3,4,6,7,8,9这几个位置上的数都是1,我们暂时把它们看成一个集合{1,3,4,6,7,8,9}

那么对于110101001(425的二进制) 集合就是{1,4,6,8,9} 而001101101则是{1,3,4,6,7}.

很显然的{1,4,6,8,9}与{1,3,4,6,7}.都是{1,3,4,6,7,8,9}的子集.{1,3,4,6,7,8,9} - {1,4,6,8,9} = {3,7} 现在我们来看下第三位还有第七位的情况,在110101001 的第三位是0而1101101的第三位是1, 110101001 的第七位是0而1101101的第七位是1, 我们把.{1,3,4,6,7,8,9} - {1,4,6,8,9} = {3,7} 做个简单的变形---> .{1,3,4,6,7,8,9} = {1,4,6,8,9} + {3,7} 通过前面的分析我们是不是很轻松的可以得到a | b = a + {3,7}

这里的{3,7}表示的含义前面已经说过是代表作着,某一位上a为0而b等于1的情况.那这个关系表示出来应该是这样子的 b & ~a,有些人可能

觉得b & ~a难以理解,其实很好理解的,b & a的时候,某一位置a与b都是1那么这个位置上的结果也是1.而现在要对a取反,1变成0.0变成1,那这样取反之后我们再做与运算,那不就相当于结果记录了在没有对a取反之前某一位置上a = 0 b =1 这种情况咯..也就是我们的{3,7}

由此a | b = (b & ~a) + a ,至于a | b = (a & ~b) + b与刚才的结果只是考虑的角度不一样而已.本质上是一样的

有了a | b = (a & ~b) + b 现在来看看a & b = (~x | y) - ~ x就简单很多了,把a | b = (a & ~b) + b华丽的代入就可以了

位运算还有其他式子,因为相对比较简单就不一一列举了.

水平有限,若有错误希望大家疯狂的提出来哈~~~~

位运算里面几个式子的推导相关推荐

  1. 位运算获取相反数详解

    位运算有很多化腐朽为神奇的操作,取相反数就位列其中,我们总是用[取反+1]来求相反数,就如同公式一样使用,可否曾仔细琢磨过其中的原理呢? 为什么[取反+1]是相反数? 在数学中,互为相反数的两数相加为 ...

  2. 位运算卷积(FWT)

    本文大量参考了: command_block 的博客:位运算卷积(FWT) & 集合幂级数 FWT 概论 定义位运算卷积:C[k]=∑i⊕j=kA[i]B[j]C[k]=\sum\limits ...

  3. 进制转换 位运算(包括补码、原码、反码、~0等一些零碎东西一次说清)

    我发现网上关于标题上的内容介绍的都很零碎,因此为了方便查找.也为了本人对这一部分的充分理解,就想着写一篇这样的博客(我分成了几个部分,以便查找): 一.进制转换 让我们先来看看各个进制的定义: 十进制 ...

  4. 技术图文:位运算技术在求解算法题中的应用

    背景 前段时间,在知识星球立了一个Flag,这是总结Leetcode刷题的第一篇图文. 在总结这篇图文的时候,顺便把遇到的坑写了两篇辅助的图文,大家可以参考一下: 有符号整型的数据范围为什么负数比正数 ...

  5. 利用位运算和指针实现的交换两个数的程序

    位运算是C语言的一大特色,利用异或运算可以实现交换两个数,原理是一个整数与另外一个数进行两次异或运算仍然是其本身,基本原理用式子表达如下: (1) A ^ A = 0; (2) A = A ^B; ( ...

  6. 为什么地磅的读数有进制么_谈谈二进制(三)——位运算及其应用

    0. 概要 前两篇文章我们了解了二进制的基本原理(谈谈二进制(一))以及二进制的四则运算(谈谈二进制(二)),本篇我们一起来看看二进制的位运算.先来看一下有哪些位运算: 上表中列出了我们编程语言中的所 ...

  7. c语言或者cpp中位运算的技巧

    简述 在知乎上看到一个题目,解答很有意思,用的是位运算. 这让我觉得位运算有更多的算法可能,但是却还没被我用过. 这种东西都是第一次看,觉得挺牛的,第二次,第三次看的时候就觉得没什么了.So,大佬们轻 ...

  8. 蓝桥备赛第一周2021.1.11 递归 枚举 位运算

    文章目录 递归实现指数型枚举 递归指数型枚举 方法1:肯定是2^n行,所以直接就是上一个动态m从0到n加一堆空行 方法2:以最新的值为n为结束,遇到为0的不输出,用完要恢复为0 递归实现排列型枚举 非 ...

  9. 2021牛客暑期多校训练营5 E-Eert Esiwtib(树形dp+位运算)

    E-Eert Esiwtib 位运算考虑贡献时分0/1按位模拟考虑 fu,0/1/2f_{u,0/1/2}fu,0/1/2​表示子树u中点(包括u)到u所有路径的或/与/异或值. 转移的时候我们要考虑 ...

最新文章

  1. elasticsearch-.yml(中文配置详解)
  2. 添加MySql数据库超时设置的相关问题
  3. 3分钟掌握支持向量机-机器学习面试必备
  4. 搜索引擎语法简介 google shodan censys zoomeye fofa dnsdb
  5. 计算机在线平方,完全平方数批量判断在线计算器_三贝计算网_23bei.com
  6. 体积最小桌面linux,Tiny Core Linux - 体积最小的精简 Linux 操作系统发行版之一 (仅10多MB) - 蓝月网络...
  7. postfix邮件服务器
  8. Entity Framework 6 Recipes 2nd Edition(13-4)译 - 有效地创建一个搜索查询
  9. MySQL 开源工具集合
  10. SQLi LABS Less-13 报错注入+布尔盲注
  11. 新手教程:Mac电脑如何设置自动隐藏菜单栏?
  12. 亮度翻转_双轴翻转屏设计 ConceptD 3 Ezel设计师本评测
  13. 信号检测与估计-理论与应用_信号R-实时应用
  14. 用户研究:用户行为分析
  15. stm32数据手册boot_stm32f103中文手册.pdf
  16. jquery 图片左右切换,一长条的显示,点击左右移动。
  17. Docker容器运行
  18. tushare获取沪深300指数历史_tushare正确爬取 指数数据
  19. 解决Word中插入表格超过页面边界问题
  20. 【微信公众平台开发之一】微信公众平台开发环境搭建

热门文章

  1. 架构师知识体系全景图
  2. 游戏编程精粹 附带光盘
  3. java计算机毕业设计流浪狗领养系统MyBatis+系统+LW文档+源码+调试部署
  4. 49、SD卡FATFS文件系统实验
  5. ActivityThread的理解和APP的启动过程
  6. php authorize,/TMP问题与An AJAX HTTP error与Path: /core/authorize.php/core/authorize.php解决办法...
  7. 转:一个结婚四年的gg的真实感受
  8. 计算机无法连接到本地网络连接,电脑本地连接禁用连接出错怎么办?
  9. 高逼格Android转场动画
  10. Android 输入法联想功能