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

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

Part0:符号约定

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

xi:x在二进制下的第i位数.

Part1:二进制

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

x=i=0n10ibi

其中,n=log10x,bi{0,1,2,,9}(i=1,2,,n).我们把该式中的所有10都换成2,则有:

x=i=0n2ibi

其中,n=log2x,bi{0,1}(i=1,2,,n).我们将数位

bnbn1b1b0¯(2)

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

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

我们来考虑x,x2,2x二进制之间的关系.因

x=i=0n2ixi

故有

x2=i=0n2ixi2=i=1n2ixi2+x02

显然左边的加数整除2.又x0{0,1},故x02=0.所以

x2=i=1n2i1xi=i=0n12ixi+1

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

112=1011(2)2=101(2)=5

再来考虑2x.

x=i=0n2ixi

2x=i=0n2i+1xi=i=1n+12ixi1

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

2×6=2×110(2)=1100(2)=12

更一般地,有

x2k=i=0nk2ixi+k2kx=i=kn+k2ixik

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

xk=x2kxk=2kx

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

x=(x1)1+(xmod2)

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

x=2x2+(xmod2)

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

Part3:与运算和或运算

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

x=i=0n2ixi,y=i=0m2iyi,

定义

x and y=xy=i=0min{n,m}2i[xi=1yi=1]=i=0min{n,m}2ixiyi=i=0min{n,m}2ixi+yi2

xy与运算(and operation).而

x or y=xy=i=0max{n,m}2i[xi=1yi=1]=i=0max{n,m}2ixi+yi2

xy或运算(or operation).显然有

xymax{x,y}xymin{x,y}

Part4:取反

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

¬x=i=0n2i[xi=0]

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

x+¬x=2n+11,¬¬x=x.

Part5:异或

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

x xor y=xy=i=0max{n,m}2i[xiyi]=i=0max{n,m}2i(xi+yimod2)

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

1.交换性:xy=yx.

2.结合性:xyz=(xy)z=x(yz).

3.幂零性:xx=0.

4.还原性:xyx=y.特别地,有x0=0x=x.

4.转换性:w=xyzx=wyz.

5.与其它位运算的关系:xy=(¬xy)(x¬y).

Part6:位运算方程

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

1.位移常数

2.异或

3.取反

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

{xy=z¬z=4x2=1

根据第三个方程,易知

x=12=4.

根据第二个方程,有

z=¬4=3.

因此,

y=zx=34=7.

所以原方程组的解为

{x=4,y=7,z=3.

再来考虑位运算方程组:

{xyz=w(¬x)y=6x2=1z(¬y)=9

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

y=6(¬x)=63=5.

故得

z=9(¬y)=92=11.

于是

w=xyz=4511=10.

因此原方程组的解为

{x=4,y=5,z=11,w=10.

本文完

posted @   Anverking  阅读(2142)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示