二进制与位运算(数学篇)

PS:本文主要介绍位运算的数学性质,和OI没有太大关联.

Part0:符号约定

([p]):艾弗森记号.对于命题(p),当(p)成立时,([p])(1),否则为(0).

(x_i):(x)在二进制下的第(i)位数.

Part1:二进制

对于任意的非负整数(x),众所周知,其可以表示为:

[x=sum_{i=0}^n 10^i b_i ]

其中,(n=lfloor log_{10} x floor,b_iin{0,1,2,dots,9}(i=1,2,dots,n)).我们把该式中的所有(10)都换成(2),则有:

[x=sum_{i=0}^n 2^i b_i ]

其中,(n=lfloor log_2 x floor,b_iin{0,1}(i=1,2,dots,n)).我们将数位

[overline{b_n b_{n-1} dots b_1 b_0}_{(2)} ]

称为(x)二进制(分解),这种分解是惟一的.为方便,我们在本文中简记(x_i=b_i),为(x)在二进制下的第(i)位数.

Part2:二进制递推式与位移运算

我们来考虑(x,lfloor frac x2 floor,2x)二进制之间的关系.因

[x=sum_{i=0}^n 2^i x_i ]

故有

[leftlfloor frac x2 ight floor=leftlfloor frac{sumlimits_{i=0}^n2^i x_i}2 ight floor=leftlfloor frac{sumlimits_{i=1}^n 2^i x_i}2 + frac{x_0}2 ight floor ]

显然左边的加数整除(2).又(x_0in{0,1}),故(frac{x_0}2=0).所以

[leftlfloor frac x2 ight floor=sum_{i=1}^n 2^{i-1}x_i=sum_{i=0}^{n-1} 2^i x_{i+1} ]

这相当于把整个二进制往右移(1)位,并把不为整数的部分截掉,比如,(11=1011_{(2)}),则

[leftlfloorfrac{11}2 ight floor=leftlfloor frac{1011_{(2)}}2 ight floor=101_{(2)}=5 ]

再来考虑(2x).

[x=sum_{i=0}^n 2^i x_i ]

[2x=sum_{i=0}^n 2^{i+1} x_i=sum_{i=1}^{n+1} 2^i x_{i-1} ]

这相当于把整个二进制往左移(1)位,并在低位补全零,比如,(6=110_{(2)}),则

[2 imes 6=2 imes{110_{(2)}}=1100_{(2)}=12 ]

更一般地,有

[leftlfloorfrac{x}{2^k} ight floor=sum_{i=0}^{n-k}2^i x_{i+k}\ 2^kx=sum_{i=k}^{n+k}2^i x_{i-k} ]

其中(kinmathbb{N}^+).我们把这两种运算分别称为右移(right shift)左移(left shift),分别记为

[xgg k=leftlfloorfrac{x}{2^k} ight floor\ xll k=2^kx ]

特别地,当(k>n)时,(xgg k=0).右移的意义是将二进制往右移(k)位,并将不为整数的部分截掉;左移的意义是讲二进制往左移(k)位,并在低位补全零.我们很容易得到:

[x=(xgg1)ll1 + (xmod 2) ]

这就是二进制的递推式.亦即:

[x=2leftlfloorfrac x2 ight floor+(xmod 2) ]

这样就可以快速地求出一个非负整数的二进制表示了.

Part3:与运算和或运算

对于两个非负整数(x,y),设

[x=sum_{i=0}^n 2^ix_i,\ y=sum_{i=0}^m2^iy_i, ]

定义

[x ext{and} y=xland y=sum_{i=0}^{min{n,m}}2^i[x_i=1land y_i=1]=sum_{i=0}^{min{n,m}} 2^i x_iy_i=sum_{i=0}^{min{n,m}}2^ileftlfloorfrac{x_i+y_i}2 ight floor ]

(x)(y)与运算(and operation).而

[x ext{or} y=xlor y=sum_{i=0}^{max{n,m}} 2^i[x_i=1lor y_i=1]=sum_{i=0}^{max{n,m}} 2^i leftlceilfrac{x_i+y_i}2 ight ceil ]

(x)(y)或运算(or operation).显然有

[xland ylemax{x,y}\ xlor ygemin{x,y} ]

Part4:取反

一个数的取反运算(not operation)定义为

[lnot x=sum_{i=0}^n 2^i[x_i=0] ]

相当于把值为(1)的位改成(0),把值为(0)的位改成(1).一般地,有

[x+lnot x=2^{n+1}-1,\ lnotlnot x=x. ]

Part5:异或

这是我们要重点讨论的位运算.其定义为

[x ext{xor} y=xoplus y=sum_{i=0}^{max{n,m}}2^i[x_i e y_i]=sum_{i=0}^{max{n,m}}2^i(x_i+y_imod 2) ]

显然有(|x-y|le xoplus yle x+y).容易验证,异或运算(exclusive or operation,xor operation)具有以下性质:

(1.)交换性:(xoplus y=yoplus x).

(2.)结合性:(xoplus yoplus z=(xoplus y)oplus z=xoplus (yoplus z)).

(3.)幂零性:(xoplus x=0).

(4.)还原性:(xoplus yoplus x=y).特别地,有(xoplus 0=0oplus x=x).

(4'.)转换性:(w=xoplus yoplus zRightarrow x=woplus yoplus z).

(5.)与其它位运算的关系:(xoplus y=(lnot xland y)lor(xlandlnot y)).

Part6:位运算方程

我们把形如只含有以下三种运算的方程叫做位运算方程(组)(bit operation equations):

(1.)位移常数

(2.)异或

(3.)取反

显然,这几种运算是可逆的.先来一道简单题.考虑位运算方程组

[egin{cases} xoplus y=z\ lnot z=4\ xgg 2=1 end{cases} ]

根据第三个方程,易知

[x=1ll 2=4. ]

根据第二个方程,有

[z=lnot 4=3. ]

因此,

[y=zoplus x=3oplus 4=7. ]

所以原方程组的解为

[egin{cases} x=4,\ y=7,\ z=3. end{cases} ]

再来考虑位运算方程组:

[egin{cases} xoplus yoplus z=w\ (lnot x)oplus y=6\ xgg 2=1\ zoplus (lnot y)=9 end{cases} ]

显然有(x=4).进一步带入第二个方程有

[y=6oplus(lnot x)=6oplus 3=5. ]

故得

[z=9oplus (lnot y)=9oplus 2=11. ]

于是

[w=xoplus yoplus z=4oplus 5oplus 11=10. ]

因此原方程组的解为

[egin{cases} x=4,\ y=5,\ z=11,\ w=10. end{cases} ]

本文完

原文地址:https://www.cnblogs.com/Anverking/p/math-bits.html