【算法专题】位运算

本文介绍了位运算的基础概念和常用操作,如位与(&),位或(|),位异或(^),右移(>>),修改特定位,位图和哈希表的应用。并通过实例解析了如何利用位运算解决LeetCode上的算法题,如找出只出现一次的数字和两整数之和的不使用加减运算的计算方法。

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

目录

常见位运算总结

位运算相关算法题

1. 只出现一次的数字

2. 只出现一次的数字(|||)

3. 两整数之和

4. 只出现一次的数字(||)

5. 消失的两个数字


常见位运算总结

        在开始刷位运算这个类型的题目前,我想先带着大家学习一下一些常见的基础运算操作,我们后面刷题时对题目的处理都是基于这些基本运算。

1. 基础位运算

        想必大家对位运算符都是非常熟悉的,在这里,我为大家讲讲我对几个按位操作符的理解

        &:有0就是0

        | :有1就是1

        ^ :相同为0,相反为1 (也可以视作为无进位相加)

2. 给一个数n,确定二进制表示中第x位是0还是1

        (n >> x) & 1

3. 将一个数n的二进制表示的第x位修改成1

        n |=(1 << x)

4. 将一个数n的二进制表示的第x位修改成0

        n &= (~(1 << x))(~就是取反)

5. 位图的思想

        位图的本质就是个哈希表,我们先前学习过的哈希表在大部分情况下都是数组形式的

使用一个变量的比特位来记录信息,对哈希表的增删查改,就相当于是对比特位的增删查改,这就意味着,我们前面讲到的几种常见的位运算操作都是非常重要的,能帮助我们更好地操作位图

6. 提取一个数n最右侧的1

        这个描述听起来有些抽象,我为大家举个例子:

        这就是提取最右侧的1

        操作方式:n & -n

        -n是由n按位取反再+1得到的:

        通过这个例子我们发现了:n与-n的关系是,在最右侧的1的左侧,n与-n完全相反;在最右侧的1的右侧,n与-n完全相同。则左侧区域两者&的结果必定为0,右侧区域&的结果不变,于是我们实现了把最右侧1提取出来的操作。

7. 干掉一个数n二进制表示中最右侧的1

        n & (n - 1)

        众所周知,减法是存在借位的,n - 1的本质就是,将最右侧的1右侧的区域全部取反

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值