以更快的速度解决问题(位运算)

211 阅读5分钟

位运算简介

从现代计算机中所有的数据二进制的形式存储在设备中。即 0、1 两种状态,计算机对二进制数据进行的运算(+、-、*、/)都是叫位运算,即将符号位共同参与运算的运算。

位运算概览

image.png

按位与运算符(&)

运算规则

对二进制数进行“与”运算,只有当两个二进制位都为1时,结果才为1,否则为0

0&0=0  0&1=0  1&0=0  1&1=1

按位与的用途

  • 清零

    如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零。

    二进制情况下 10010001000101 & 00000000000000 = 0
    十进制情况下 9285 & 0 = 0
    注 9285的二进制是10010001000101
    
  • 取一个数的指定位

    比如取数 X=10010001000101 的低4位,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=00000000001111,然后将X与Y进行按位与运算(X&Y=00000000000101)即可得到X的指定位。

    二进制 10010001000101 & 00000000001111 = 00000000000101
    十进制 9285 & 15 = 5
    注 9285的二进制是10010001000101
       15的二进制是00000000001111
    
  • 判断奇偶

    只要根据最未位是0还是1来决定,为0就是偶数,为1就是奇数。因此可以用if ((a & 1) == 0)代替if (a % 2 == 0)来判断a是不是偶数

按位或运算符(|)

运算规则

对二进制数进行“或”运算,只要有一个二进制位为1,结果就为1,否则为0

0|0=0  0|1=1  1|0=1  1|1=1

按位或运算符用途

  • 将一个数据的某些位设置为1

    比如将数 X=10010001000101 的低4位设置为1,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=00000000001111,然后将X与Y进行按位或运算(X|Y=10010001001111)即可得到

    二进制 10010001000101 | 00000000001111 = 10010001001111
    十进制 9285 | 15 = 9295
    注 9285的二进制是10010001000101
       15的二进制是00000000001111
    

异或运算符(^)

运算规则

对二进制数进行“异或”运算,如果两个二进制位相同,则结果为0,否则为1

0^0=0  0^1=1  1^0=1  1^1=0

性质

  • 交换律

    a ^ b = b ^ a

  • 结合律

    (a ^ b) ^ c == a ^ (b ^ c)

  • 对于任何数x,都有 x ^ x = 0,x ^ 0 = x

  • 自反性

    a ^ b ^ b = a ^ 0 = a

异或运算符用途

  • 交换两个数

    二进制 a = 10010001000101  
    二进制 b = 00000000001111 
    十进制 a = 9285
    十进制 b = 15
    a = a ^ b
    b = b ^ a
    a = a ^ b
    
  • 与0相异或值不变

    二进制 a = 10010001000101  
    二进制 b = 00000000001111 
    十进制 a = 9285
    十进制 b = 15
    a ^ 0 = 10010001000101 
    b ^ 0 = 00000000001111
    
  • 翻转指定位

    比如将数 X=10010001000101 的低4位进行翻转,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=0000 1111,然后将X与Y进行异或运算(X^Y=1010 0001)即可得到

    二进制 10010001000101 ^ 00000000001111 = 10010001001010
    十进制 9285 ^ 15 = 9290
    注 9285的二进制是10010001000101
       15的二进制是00000000001111
    

取反运算符(~)

运算规则

对一个二进制数进行“非”运算,将0变为1,将1变为0

~1 = 0 
~0 = 1

取反运算符用途

  • 取反

    二进制 ~1 = 0 
    二进制 ~0 = 1
    

左移运算符(<<)

运算规则

将一个二进制数向左移动指定的位数,右边用0填充

二进制 a = 10101110
a << 2
二进制 a = 10111000

左移运算符用途

  • 一个数乘以移位的位数乘以二,例如左移两位则将该数乘以两次二

    十进制 15 << 2 = 60
    

右移运算符(>>)

运算规则

将一个二进制数向右移动指定的位数,左边用符号位填充

二进制 a = 10101110
a >> 2
二进制 a = 00101011
十进制 174 >> 2 = 43

二进制 b = -10101110
b >> 1
二进制 b = -1010111
十进制 -174 >> 1 = -87