Fork me on GitHub

常用的移位预算的意义


最近发现很多地方用到移位、与等运算代替了常用的乘除法。这样做可以从很大程度上提高程序的效率缩短程序运行时间。但是这样做对于我这样的初学者来说一下子不能快速理解,所以在这里记录下一些常用的运算以及他们所代表的含义:
给定一个无符号整数n = 15, 它的二进制数为1111,下面我们结合这个数说说各个运算的含义

  • n >> 1 将n向右移动一位,变为0111 = 7, 表示的数学含义是 n/2
  • n << 1 将n向左移动一位,变为11110 = 30,表示的数学含义是 n * 2
  • n & 0X1 常用语判断n的奇偶性,如果n & 0X1 == 1 说明n的二进制中最后一位是1,即n是奇数
    如果 n & 0X1 == 0说明n的二进制位最后一位是0,即n是偶数
  • n & (n-1) 所得结果是将n的最右边的1去掉
    n & (n-1) 统计N的二进制数中1的个数
    n | (n-1) 统计N的二进制数中0的个数
    eg : 求一个数n的二进制位中1的个数
    1
    2
    3
    4
    5
    6
    int counter = 0;
    while(n)
    {
    ++counter;
    n = n & (n - 1);
    }

n & (n - 1) == 0 表示n是2的整数次幂
n & (n - 1) != 0 表示n不是2的整数次幂

Enjoy it ? Donate for it ! 欣赏此文?求鼓励,求支持!
>