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

通解通法 - 每次消去最右边的1 

把一个整数减去1,再和原来的整数做与运算,会把该整数最右边一个1变成0。

那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。

eg:

原整数为 1110...

1110 & (1110 - 1) = 1110 & 1101 = 1100

1100 & (1100 - 1) = 1100 & 1011 = 1000

1000 & (1000 - 1) = 1000 & 0111 = 0000

> 判断一个是是不是2的整数次方

如果是,那么2进制中有且只有一位是1 !!! 

> 计算要改变多少位,M才能变成N

先计算M和N的异或,得出有多少位不同,也就是多少位1

扫描二维码关注公众号,回复: 5401995 查看本文章

然后再计算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

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

猜你喜欢

转载自www.cnblogs.com/frankcui/p/10468228.html