通解通法 - 每次消去最右边的1
把一个整数减去1,再和原来的整数作与运算,会把该整数最右边一个1变成0。spa
那么一个整数的二进制表示中有多少个1,就能够进行多少次这样的操做。code
eg:blog
原整数为 1110...class
1110 & (1110 - 1) = 1110 & 1101 = 1100效率
1100 & (1100 - 1) = 1100 & 1011 = 1000二进制
1000 & (1000 - 1) = 1000 & 0111 = 0000di
> 判断一个是是否是2的整数次方
若是是,那么2进制中有且只有一位是1 !!! while
> 计算要改变多少位,M才能变成N
先计算M和N的异或,得出有多少位不一样,也就是多少位1co
而后再计算1的个数数字
> 判断奇偶数 / 判断最右一位是不是1
让该数字直接与1作与运算。若是结果是1,那么该数字最右一位必定是1.
eg:
1101 & 0001 = 0001
1100 & 0001 = 0000
> 依次判断每一位是否为1
n为要输入的数字,flag从1开始,依次左移一位去挨个判断n的每一位
1 while(flag){ 2 if(n & flag){ 3 //do someting... 4 } 5 flag = flag << 1; 6 }
> 快速乘以2,除以2
左移运算符,<<,等同于乘以2
右移运算符,>>,等同于除以2
位运算比乘除法效率高得多!!!