zoukankan      html  css  js  c++  java
  • 二进制与位运算(数学篇)

    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} ]

    本文完

  • 相关阅读:
    haproxy 2.5 发布
    cube.js sql 支持简单说明
    基于graalvm 开发一个cube.js jdbc driver 的思路
    apache kyuubi Frontend 支持mysql 协议
    oceanbase 资源池删除说明
    基于obd 的oceanbase 扩容说明
    jfilter一个方便的spring rest 响应过滤扩展
    cube.js schema 定义多datasource 说明
    typescript 编写自定义定义文件
    meow 辅助开发cli 应用的工具
  • 原文地址:https://www.cnblogs.com/Anverking/p/math-bits.html
Copyright © 2011-2022 走看看