位运算总结

匿名 (未验证) 提交于 2019-12-02 23:34:01
版权声明:本文为博主原创文章,转载请标明出处,蟹蟹 https://blog.csdn.net/fly_wt/article/details/90473649

常用的位运算有6个:
&
|
~
^ 相当于不进位的加法
<< << 1 相当于x2 上取整 << 3相当于x8
>> >> 1 相当于/2 下取整

技巧篇

  1. lowbit运算1n & -n == n的二进制表示里最右边的1,所以 n & -n == n 表示n的2的整数次幂,n & -n < n则n不为2的整数次方
  2. lowbit运算2n & (n -1)就会把该整数二进制的最后一位1置零
  3. 异或运算^: a ^ a = 0 , 0 ^ a = a而且异或满足交换律结合律

实战篇:剑指offer15题――二进制中的1的个数

本题思考方式可以将数字的最后一位和1进行与运算,然后右移来统计二进制中的1.但是如果整数为负数的时候,就会出现补1的情况从而造成死循环。

解决办法1

将输入的数字强制转换成unsigned int类型即可。

class Solution { public:     int NumberOf1(int n) {         int res = 0;         unsigned int un = n;          while (un) res += un & 1, un >>= 1;         return res;     } }; 

解决办法2

设置一个unsigned int flag = 1 每次与输入整数进行与运算后判断是否为1尔后左移统计1的个数,从而负数高位补零造成死循环。

class Solution { public:     int NumberOf1(int n) {         int res = 0;         unsigned int flag = 1;          while (flag) {         	if (flag  & n) res++;         	flag <<= 1;         }         return res;     } }; 

解决办法3

n & (n -1)就会把该整数二进制的最后一位1置零。那么二进制数有多少个1就会进行多少次这样的操作。

class Solution { public:     int NumberOf1(int n) {         int res = 0;         while (n){         	n &= (n + 1);         	res++;         }         return res;     } }; 

相关题目:

  1. 判断一个整数是不是2的整数次方。
  2. 输入两个数m和n,计算需要改变m的二进制表示的多少位才能得到n。
文章来源: https://blog.csdn.net/fly_wt/article/details/90473649
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!