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


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

    本文完

  • 相关阅读:
    commonjs
    基于webpack的vue开发环境搭建
    vs工程配置eslint检测环境
    h5笔记
    NPM install -save 和 -save-dev 区别
    小的div在大的div中垂直居中
    css position absolute相对于父元素的设置方式
    Python的支持工具[0] -> 环境包管理工具[1] -> Anaconda
    Python的支持工具[0] -> 环境包管理工具[0] -> pip
    代码编辑器[0] -> Vim/gVim[2] -> Vim 的相关知识
  • 原文地址:https://www.cnblogs.com/Anverking/p/math-bits.html
Copyright © 2020-2023  润新知