8月算法训练------第十一天(位运算)解题报告

本文通过两道经典题目,深入解析位运算的应用技巧。首先介绍了一种高效计算二进制中1的数量的方法,接着探讨了如何仅使用位运算实现两个整数相加。适合希望提升位运算技能的读者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

8月算法训练------第十一天(位运算)解题报告

题目类型:位运算
题目难度:简单

第一题、剑指 Offer 15. 二进制中1的个数

  1. 题目链接:剑指 Offer 15. 二进制中1的个数
  2. 思路分析:
    这是一道非常经典的题,也是位运算中非常好的题。
    运用与运算,将n & (n-1),这个可以将n的二进制的最低位的1去掉,总共去了多少次,就代表二进制中有多少个1.
  3. 代码:
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. 不用加减乘除做加法

  1. 题目链接:剑指 Offer 65. 不用加减乘除做加法
  2. 思路分析:
    其实这一题可以直接返回a+b的结果,但为了练习位运算,它偏偏不让我用加法。它真的,我哭死。
    这里运用到与运算、或运算和移位运算:
    当a的一位与b的对应位都为1时,将这一位用与运算变为1,为了表示进位,将这个数用移位运算向左移动一位,就可以表示这一位的进位了;然后还需要表示最终的结果:就是用这两个数运用异或运算,将这两个数的运算位得到结果,然后将b等于进位的数,这样就可以在下一次循环种得到这个进位数,继续对这个数进行之前的操作。
  3. 代码:
class Solution {
    public int add(int a, int b) {
        while(b != 0){
            int c = (a & b) << 1;
            a ^= b;
            b = c;
        }
        return a;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值