在编程中,位运算是对整数在二进制表示形式下的位进行的操作。这些运算在底层非常高效,通常用于优化性能、处理低级编程任务(如硬件驱动开发、加密算法)和处理特定的数学问题。下面是一些常用的位运算符,以及它们的数学意义和使用场景:
与&
对两个数的每一位进行逻辑与操作.
只有两个数同为真(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的指定次幂并向下取整.
这个证明也很简单和上面左移类似.