📌 Java 位运算简介
Java 提供了与二进制操作相关的位运算符,主要包括:
| 操作符 | 作用 |
|---|---|
& | 按位与(AND) |
| ` | ` |
^ | 按位异或(XOR) |
~ | 按位取反(NOT) |
<< | 左移(左移 n 位,相当于乘 2^n) |
>> | 右移(右移 n 位,相当于除 2^n,保留符号位) |
>>> | 无符号右移(高位补 0) |
📌 代码 1:使用 toBinaryString() 和 replaceAll() 统计二进制中 1 的个数
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
String str = Integer.toBinaryString(num); // 将整数转换为二进制字符串
int length = str.length();
String newStr = str.replaceAll("1", ""); // 用空字符串替换所有 "1",剩下的都是 "0"
System.out.println(length - newStr.length()); // 原长度 - 替换后长度 = "1" 的个数
}
}
📌 toBinaryString(int num) 方法
-
作用:将
num转换为 无符号二进制表示 的 字符串。 -
示例
System.out.println(Integer.toBinaryString(5)); // 输出:101 System.out.println(Integer.toBinaryString(7)); // 输出:111 System.out.println(Integer.toBinaryString(10)); // 输出:1010
📌 replaceAll(String regex, String replacement) 方法
-
作用:使用正则表达式
regex进行全局替换,并返回新的字符串。 -
示例
String str = "Hello World!"; String newStr = str.replaceAll("l", "*"); System.out.println(newStr); // 输出:He**o Wor*d!在代码中:
String newStr = str.replaceAll("1", "");作用:去掉
str字符串中所有的1,只留下0。
📌 代码 2:使用位运算统计二进制中 1 的个数
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int num = in.nextInt(); // 读取整数
int n = 0; // 计数变量
for (int i = 0; i < 32; i++) { // 遍历 32 位
if ((num & 1) == 1) // 取最后一位,如果是 1,计数加 1
n++;
num = num >>> 1; // 无符号右移 1 位
}
System.out.println(n);
}
}
📌 num & 1 的作用
-
num & 1只保留num的最后一位,判断该位是否是1。 -
示例
int num = 5; // 二进制:101 System.out.println(num & 1); // 输出 1 (最后一位是 1) num = num >>> 1; // 右移,变成 10 System.out.println(num & 1); // 输出 0 (最后一位是 0)
📌 >>> 无符号右移
-
>>> 1:无符号右移 1 位,高位补 0 -
示例
int num = -5; // 二进制补码表示:11111111111111111111111111111011 System.out.println(num >>> 1); // 01111111111111111111111111111101
📌 代码对比分析
| 代码 | 方法 | 时间复杂度 | 空间复杂度 | 优缺点 |
|---|---|---|---|---|
| 代码 1 | toBinaryString() + replaceAll() | O(n) | O(n) | 简单直观,但有额外的字符串存储 |
| 代码 2 | 位运算 (& 和 >>>) | O(1) | O(1) | 更高效,无需额外存储 |
📌 哪种方法更好?
✅ 推荐使用 代码 2(位运算) ,它更高效,适用于大数计算。
代码 1 适合初学者,代码 2 是更专业的写法。
📌 例子测试
输入
7
代码 1 输出
3
代码 2 输出
3
两种方法都能正确计算二进制 111 里 1 的个数 ✅
🚀 现在你完全掌握 Java 位运算! 🎯