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

本文详细推导了位运算中的一些关键式子,如-a = ~a + 1,a + b = (a & b) + (a | b),以及a | b = (a & ~b) + b。通过对这些基本公式的理解,帮助读者深入掌握位运算的原理。
摘要由CSDN通过智能技术生成

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

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

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

约定好了操作符之后我们来看最简单的例子, -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华丽的代入就可以了

 

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值