优选算法系列(5.位运算)

目录

一.常见的位运算总结

二.判断字符是否唯⼀(easy)

三.丢失的数字

四.两整数之和(medium)

[五.只出现一次的数字 II(medium)](#五.只出现一次的数字 II(medium))

六.消失的两个数字(hard)


一.常见的位运算总结

1.基础位运算

  • << : 所有二进制位向左移动指定的位数,低位补0,每左移1位相当于乘以2
  • >>:的所有二进制位向右移动指定的位数,高位补0,高位补符号位(算术右移)每右移1位相当于除以2(整数除法)
  • ~:按位取反
  • & : 有0就是0
  • | : 有1就是1
  • ^ : 相同为0,相异为1

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

直接让那个位置的数字右移到最低位与(&)1取出最低位。

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

让第x位置或(|)1,其他位不变(或0),即n要或的数就是1左移x位置

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

让第x位置与(&)1,其他位不变(与1),即n要或的数就是(1左移x位置然后取反~)

5.位图的思想

本质就是一个哈希表,但是之前的哈希表是一个数组,但是现在这里的哈希表是一个int的二进制位,让每一个比特位记录信息

6.提取一个数(n)二进制表示中最右侧的1

eg:

只需要 n & -n

因为-n的本质是,将最右侧的1,左边的区域全部变成相反

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

只需要 n & (n-1)

因为 n-1 的本质是,将最右侧的1,右边的区域(包含1)全部变成相反

8.位运算的优先级

(能加括号就加括号)

题目:

191. 位1的个数 - 力扣(LeetCode)

338. 比特位计数 - 力扣(LeetCode)

461. 汉明距离 - 力扣(LeetCode)

9.异或(^)运算的运算律

  • a^0=a
  • a^a=0 (消消乐)
  • a^b^c=a^c^b

题目

136. 只出现一次的数字 - 力扣(LeetCode)

260. 只出现一次的数字 III - 力扣(LeetCode)

二.判断字符是否唯⼀(easy)

  • 解法(位图的思想):

利⽤「位图」的思想,每⼀个「比特位」代表⼀个「字符,⼀个 int 类型的变量的 32 位足够表示所有的小写字母。比特位里面如果是 0 ,表⽰这个字符没有出现过。⽐特位⾥⾯的值是 1 ,表示该字符出现过。
那么我们就可以⽤⼀个「整数」来充当「哈希表」。

  • 代码:

C++:

java:

三.丢失的数字

  • 解法(位运算):

设数组的大小为 n ,那么缺失之前的数就是 0, n ,数组中是在 0, n 中缺失⼀个数形成的序列。
如果我们把数组中的所有数,以及 0, n 中的所有数全部「异或」在⼀起,那么根据**「异或」运算的「消消乐」规律,**最终的异或结果应该就是缺失的数~

  • 代码:

C++:

java:

四.两整数之和(medium)

  • 解法(位运算):
  1. 异或 ^ 运算本质是「无进位加法」;
  2. 按位与 & 操作能够得到「进位」;
  3. 然后⼀直循环进行,直到「进位」变成 0 为止。

代码:

C++:

java:

五.只出现一次的数字 II(medium)

  • 解法(比特位计数):

设要找的数位 ret 。
由于整个数组中,需要找的元素只出现了「⼀次」,其余的数都出现的「三次」,因此我们可以根据所有数的「某一个比特位」的总和 %3 的结果,快速定位到 ret 的「⼀个比特位上」的值是0 还是 1 。
这样,我们通过 ret 的每⼀个⽐特位上的值,就可以将 ret 给还原出来。

  • 代码:

C++:

java:

六.消失的两个数字(hard)

  • 解法(位运算):

本题就是 268. 丢失的数字 + 260. 只出现⼀次的数字 III 组合起来的题。
先将数组中的数和 1, n + 2 区间内的所有数「异或」在⼀起,问题就变成了:有两个数出现了「⼀次」,其余所有的数出现了「两次」。进而变成了 260. 只出现⼀次的数字 III 这道题。

  • 代码:

C++:

java:

相关推荐
兰令水25 分钟前
leecodecode【面试150】【2026.6.14打卡-java版本】
java·算法·面试
JustHappy7 小时前
古法编程秘籍(七):互联网到底是什么?把两台电脑怎么说话搞懂就够了
前端·后端·网络协议
snow@li7 小时前
SEO-文章标题:写文章时候,分类+主标题+大纲+解释 作为标题 / 不点进去也知道全文覆盖什么 / 标题即架构
前端
yaoxin5211237 小时前
434. Java 日期时间 API - Period 基于日期的时间段
java·开发语言·python
凡人叶枫7 小时前
Effective C++ 条款30:透彻了解 inlining 的里里外外
linux·开发语言·c++·嵌入式开发·effective c++
noipp7 小时前
推荐题目:洛谷 P10907 [蓝桥杯 2024 国 B] 蚂蚁开会
c语言·c++·算法·编程·洛谷
学逆向的8 小时前
C++纯虚函数
开发语言·c++·网络安全
kyriewen8 小时前
Git Commit 前自动修复代码风格?配置 Husky + lint-staged,从此 CR 只聊逻辑
前端·git·面试
何极光8 小时前
IDEA集成Maven
java·maven·intellij-idea
小和尚同志8 小时前
AI 自动化测试探索(一):Playwright MCP
前端·人工智能·aigc