版权声明:本文为博主原创文章,转载请标明出处,蟹蟹 https://blog.csdn.net/fly_wt/article/details/90473649
常用的位运算有6个:&
|
~
^
相当于不进位的加法<<
<< 1 相当于x2 上取整 << 3相当于x8>>
>> 1 相当于/2 下取整
技巧篇
- lowbit运算1:
n & -n
== n的二进制表示里最右边的1,所以n & -n == n
表示n的2的整数次幂,n & -n < n
则n不为2的整数次方 - lowbit运算2:
n & (n -1)
就会把该整数二进制的最后一位1置零 - 异或运算^:
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; } };
相关题目:
- 判断一个整数是不是2的整数次方。
- 输入两个数m和n,计算需要改变m的二进制表示的多少位才能得到n。
文章来源: https://blog.csdn.net/fly_wt/article/details/90473649