位运算 - 位运算的常见用法/题目

通解通法 - 每次消去最右边的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

位运算比乘除法效率高得多!!!

相关文章
相关标签/搜索