位运算

有些话、适合烂在心里 提交于 2020-01-30 19:11:33

前面的话

巧妙使用位运算,在算法方面往往比四则运算要快许多。

左移(<<)

运算规则:

  • 将一个数的二进制全部左移若干位,右补若干个0。
  • 若要被舍弃的高位为0,则舍弃;
  • 若要被舍弃的高位为1,则不舍弃。

若a=15,将其左移2位。即a的二进制数0000 1111,将其左移2位,右补2个0,则变为00111100,即十进制的60。

若a=64,将其左移2位。即a的二进制数为0100 0000,左移一位,1000 0000,左移两位 0000 0001 0000 0000 ,即十进制的256

结论:左移一位相当于该数乘以2,左移两位相当于乘以2^2。

带符号右移(>>)

运算规则:

  • 将数的二进制形式把所有的数字向右移动对应的位数,低位移出舍弃。
  • 若是正数,高位的空位补0
  • 若是负数,高位的空位补1

若a=11,将其右移2位。即0000 1011,将其低位的最后两个数移出,因为该数字是正数,将其右移,高位补2个0,最终为0000 0010,即十进制的2。

结论:正数的右移一位相当于除2,右移n为相当于除以2的n次方。这是取商,余数不要。

右移可以在二分算法中取中间值:

例如: 13>>1 // 6

无符号右移(>>>)

运算规则:

  • 按二进制形式把所有的数字向右移动对应的位数,低位移出舍弃,高位的空位补0。
  • 没有正负数之分,高位都是补0

按位操作

  • 按位与

    每一位都为1,结果才是1

    8 & 7 // 0
    // 1000 & 0111 -> 0000 -> 0
    
  • 按位或

    其中一位为1,结果就是1

    8 | 7 // 1
    // 1000 | 0111 -> 1111 -> 15
    
  • 按位异或

    不同为1,相同为0

    8 ^ 7 // 15
    // 1000 ^ 0111  ->  1111 -> 15 
    8 ^ 8 
    // 1000 ^ 1000 ->  0000 -> 0
    

    结论:可以看出按位异或就是不进位加法

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!