好,这一块非常适合刷算法 + 面试装硬核 😄
我给你一套 由浅入深的 Java 位运算算法练习清单,每题都配思路 + 关键位运算点,不啰嗦但管用。
Java 位运算算法题目练习(从入门到进阶)
目标:
一看到题目,就能条件反射想到「位运算能不能干」
一、位运算基础热身(必刷)
1️⃣ 判断奇偶
题目:判断一个整数是奇数还是偶数
boolean isOdd(int n) {
return (n & 1) == 1;
}
📌 原理:最低位为 1 → 奇数
2️⃣ 交换两个数(不使用第三个变量)
void swap(int a, int b) {
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
⚠ 面试点:
- a、b 指向同一变量会出错
3️⃣ 判断是否是 2 的幂
boolean isPowerOfTwo(int n) {
return n > 0 && (n & (n - 1)) == 0;
}
二、位运算经典算法题(高频)
4️⃣ 统计二进制中 1 的个数
题目:Hamming Weight
int countOnes(int n) {
int count = 0;
while (n != 0) {
n &= (n - 1);
count++;
}
return count;
}
📌 技巧:
n & (n - 1)每次消掉最右边的 1
5️⃣ 找出数组中只出现一次的数字(其余出现两次)
int singleNumber(int[] nums) {
int res = 0;
for (int n : nums) {
res ^= n;
}
return res;
}
📌 核心:
- 相同的数 XOR = 0
- 0 XOR x = x
6️⃣ 找出两个只出现一次的数字
int[] singleNumberTwo(int[] nums) {
int xor = 0;
for (int n : nums) xor ^= n;
int lowbit = xor & (-xor);
int a = 0, b = 0;
for (int n : nums) {
if ((n & lowbit) == 0) a ^= n;
else b ^= n;
}
return new int[]{a, b};
}
📌 面试杀点:
lowbit = x & (-x)
三、位运算 + 数学技巧
7️⃣ 加法(不使用 + -)
int add(int a, int b) {
while (b != 0) {
int carry = (a & b) << 1;
a = a ^ b;
b = carry;
}
return a;
}
📌 理解:
^:无进位加法& << 1:进位
8️⃣ 取绝对值(不使用 if)
int abs(int x) {
int mask = x >> 31;
return (x ^ mask) - mask;
}
四、位运算 + 状态压缩(进阶)
9️⃣ 子集枚举
void subsets(int n) {
for (int mask = 0; mask < (1 << n); mask++) {
// mask 表示一个子集
}
}
📌 应用:
- 子集
- 状态 DP
- 组合问题
🔟 判断两个数是否符号相同
boolean sameSign(int a, int b) {
return (a ^ b) >= 0;
}
五、位运算面试必背 7 大技巧
1️⃣ n & (n - 1) 消除最低位 1
2️⃣ n & (-n) 提取最低位 1
3️⃣ x ^ x = 0
4️⃣ x ^ 0 = x
5️⃣ 左移相当于乘 2
6️⃣ 右移相当于除 2
7️⃣ 位运算常用于 状态压缩
六、刷题路线建议(收藏)
奇偶 / 2 的幂
↓
统计 1
↓
异或找单数
↓
不使用运算符
↓
状态压缩 / 位 DP
七、一句话终极总结
位运算 = 用二进制思考问题
如果你愿意,我可以下一步帮你:
- 🔥 LeetCode 位运算题 Top 20 精讲
- 🧠 位运算在动态规划中的高级用法
- 🧪 位运算面试“反套路”题目合集
- 📄 一页纸位运算公式速查表
你是偏 刷题拿 offer,还是 算法内功修炼?