好的,我们可以来做一系列 Java 位运算的练习题目,从基础到进阶,让你系统练习。每道题我会附上 题目描述 和 思路提示,你可以先尝试自己写代码。
1. 判断奇偶数
题目:给定一个整数 n,判断它是奇数还是偶数,不使用 % 运算符。
思路提示:
- 使用位运算
& 1可以得到最低位。 - 如果最低位为 1 → 奇数;为 0 → 偶数。
public boolean isOdd(int n) {
return (n & 1) == 1;
}
2. 交换两个整数
题目:不使用临时变量,交换两个整数 a 和 b。
思路提示:
- 可以使用 XOR 位运算:
a = a ^ b;
b = a ^ b;
a = a ^ b;
3. 计算整数的二进制中 1 的个数(汉明重量)
题目:给定一个整数 n,计算它的二进制表示中 1 的数量。
思路提示:
- 使用
n & (n-1)可以去掉最低位的 1。 - 循环直到
n为 0。
public int countOnes(int n) {
int count = 0;
while (n != 0) {
n = n & (n - 1);
count++;
}
return count;
}
4. 判断是否为 2 的幂
题目:给定整数 n,判断它是否是 2 的幂。
思路提示:
- 2 的幂在二进制中只有一个 1。
- 判断公式:
n > 0 && (n & (n - 1)) == 0
public boolean isPowerOfTwo(int n) {
return n > 0 && (n & (n - 1)) == 0;
}
5. 找出数组中唯一出现一次的数字
题目:数组中其他数字出现两次,只有一个数字出现一次,找出这个数字。
思路提示:
- 使用 XOR 可以抵消重复的数字。
- 时间复杂度 O(n),空间复杂度 O(1)。
public int singleNumber(int[] nums) {
int result = 0;
for (int num : nums) {
result ^= num;
}
return result;
}
6. 交换两个整数的奇偶位
题目:给定一个整数,将它的奇数位和偶数位交换。例如,二进制 1010 → 0101。
思路提示:
- 使用掩码提取奇数位和偶数位:
- 偶数位掩码:
0xAAAAAAAA - 奇数位掩码:
0x55555555
- 偶数位掩码:
- 左移和右移交换位置,然后 OR。
public int swapOddEvenBits(int n) {
int even = n & 0xAAAAAAAA;
int odd = n & 0x55555555;
return (even >>> 1) | (odd << 1);
}
7. 只出现一次的数字 II
题目:数组中其他数字出现三次,只有一个数字出现一次,找出这个数字。
思路提示:
- 对每一位计数,能被 3 整除的位忽略,剩下的就是只出现一次的数字。
- 可使用位运算或三状态累加器。
我可以帮你整理一份 进阶 Java 位运算刷题清单,包含 10~15 道经典面试题,从基础到困难,覆盖 奇偶判断、交换、计数、异或、掩码操作、进制变换 等。
你想让我整理吗?