常用位运算

在编程中,位运算是对整数在二进制表示形式下的位进行的操作。这些运算在底层非常高效,通常用于优化性能、处理低级编程任务(如硬件驱动开发、加密算法)和处理特定的数学问题。下面是一些常用的位运算符,以及它们的数学意义和使用场景:

与&

对两个数的每一位进行逻辑与操作.

只有两个数同为真(1)时,结果才为真(1)

常用来屏蔽特定位,比如取字节高位,低位等等.

或|

对两个数的每一位进行逻辑或操作

有一个为真则为真(1),同为假(0)时结果为假(0)

常用来设置特定位,例如将一个数的特定位设置成1

~

对一个数的每一位进行逻辑非操作

对每位进行取反

常用来生成一个数的二进制补码,即~x=-x-1

异或^

对两个数的每一位进行逻辑异或操作

不同为真(1),相同为假(0)

常用于反转特定位,或者在不使用临时变量的情况下交互两个数.

异或的性质(针对位操作)

a^0=a a^1=~a

也就是说任何数(0,1)与0异或都等于其本身,与1异或等于取反

分类证明很简单,a只有两个值0或1,当a=0时0^0=0=a a=1时 1^0=1=a,同理可证a^1=~a

异或具有交换律a^b=b^a

由异或的定义可以轻松证明.

当a,b相同时 a^b=0=b^a,当a,b不同时 a^b=1=b^a

异或具有结合律(a^b)^c=a^(b^c)

先来证明一个简单的结论(~a)^b=a^(~b)=~(a^b),由异或和取反的定义很容易证明,当a,b相同时当a,b不同时分类证明很简单.

下面来证明结合律也用分类来证明,

当b=0时由上面的性质可以轻易得出 (a^b)^c=a^c a^(b^c)=a^c所以此时成立

当b=1时有上面的性质可以轻易得出(a^b)^c=(~a)^c=~(a^c) a^(b^c)=a^(~b)=~(a^b),此时也成立

结合上面的分类可以证明异或具有结合律.

结合着交换律可以得出结论: (a^b)^c=a^(b^c)=(a^c)^b 也就是3者顺序可以随意打乱不影响结果.

对于不同位数的两个数字进行以后,缺少的位数补0所以不影响原来的数字,可以根据异或定义轻松证明: a^b=b^a a^a=0,这样我们想要交互ab的值就很简单了分成三步 1. a=a^b 2.b=a^b(也就是原来a的值) 3.a=a^b(也就是原来b的值)

左移<<

将一个数的所有位左移指定的位数.

相当于乘以2的指定次幂,即 x<<n = x*2^n

常用于快速乘以2的幂

这个很容易证明,数字x可以表示成 a0*2^0+a1*2^1+...+am*2^m 表达式1

那么x<<n可以表示成 a0*2^n+a1*2^(n+1)+...am*2^(m+n) 表达式2

很显然表达式2=表达式1*2^n也即是 x<<n=x*2^n

右移>>

分为逻辑右移和算术右移

逻辑右移>>是把所有位向右移动指定的位数,左边补0,相当于除以2的指定次幂并向下取整.

这个证明也很简单和上面左移类似.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值