8月算法训练------第十一天(位运算)解题报告
题目类型:位运算
题目难度:简单
第一题、剑指 Offer 15. 二进制中1的个数
- 题目链接:剑指 Offer 15. 二进制中1的个数
- 思路分析:
这是一道非常经典的题,也是位运算中非常好的题。
运用与运算,将n & (n-1)
,这个可以将n的二进制的最低位的1去掉,总共去了多少次,就代表二进制中有多少个1. - 代码:
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int res = 0;
while(n != 0){
n &= (n-1);
res++;
}
return res;
}
}
第二题、剑指 Offer 65. 不用加减乘除做加法
- 题目链接:剑指 Offer 65. 不用加减乘除做加法
- 思路分析:
其实这一题可以直接返回a+b
的结果,但为了练习位运算,它偏偏不让我用加法。它真的,我哭死。
这里运用到与运算、或运算和移位运算:
当a的一位与b的对应位都为1时,将这一位用与运算变为1,为了表示进位,将这个数用移位运算向左移动一位,就可以表示这一位的进位了;然后还需要表示最终的结果:就是用这两个数运用异或运算,将这两个数的运算位得到结果,然后将b等于进位的数,这样就可以在下一次循环种得到这个进位数,继续对这个数进行之前的操作。 - 代码:
class Solution {
public int add(int a, int b) {
while(b != 0){
int c = (a & b) << 1;
a ^= b;
b = c;
}
return a;
}
}