位运算、toBinaryString方法和replaceAll方法

98 阅读2分钟

📌 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
    

📌 代码对比分析

代码方法时间复杂度空间复杂度优缺点
代码 1toBinaryString() + replaceAll()O(n)O(n)简单直观,但有额外的字符串存储
代码 2位运算 (&>>>)O(1)O(1)更高效,无需额外存储

📌 哪种方法更好?

✅ 推荐使用 代码 2(位运算) ,它更高效,适用于大数计算。
代码 1 适合初学者,代码 2 是更专业的写法。


📌 例子测试

输入

7

代码 1 输出

3

代码 2 输出

3

两种方法都能正确计算二进制 1111 的个数 ✅

🚀 现在你完全掌握 Java 位运算! 🎯