在 Java 中的二进制转换程序之后,如何将我的二进制文件格式化为 4 位组?

How would I format my binary in 4 bit groups after my binary conversion program in Java?

import java.util.*;

public class Binary {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Scanner input = new Scanner(System.in);

        int number = input.nextInt();
        String binary = Integer.toBinaryString(number);
        System.out.println(binary);

    }

}

我正在尝试创建一个将整数转换为二进制并每四位分组一次的程序。比如我输入1,想得到0001,结果得到1

原始方法:

import java.util.*;
public class Binary {
    public static void main(String[] args) {
        try (Scanner input = new Scanner(System.in)) {
            int number = input.nextInt();
            String binary = Integer.toBinaryString(number);
            System.out.println(binary);

            int paddingLength = (4 - binary.length() % 4) % 4;
            StringBuilder grouped = new StringBuilder();
            for (int i = 0; i < paddingLength; i++) {
                grouped.append('0');
            }
            for (int i = 0; i < binary.length(); i++) {
                if (i != 0 && (i + paddingLength) % 4 == 0) {
                    grouped.append('.');
                }
                grouped.append(binary.charAt(i));
            }
            System.out.println(grouped);
        }
    }
}
$ java Binary.java
1
1
0001
$ java Binary.java
16
10000
0001.0000
$ 

一次取 4 位数字,并打印这些位。

使用递归实现以正确的顺序打印半字节。

public static void main(String[] args) {
   Scanner input = new Scanner(System.in);
   printbin(input.nextInt());
}

static void printbin(int number) {
    int lo = number & 15;
    int hi = number >>> 4;
    if (hi != 0) {
        printbin(hi);
        System.out.print('.');
    }
    for (int n=3; n>=0; n--) {
        System.out.print((lo >> n) & 1);
    }
}

给定 291(即 0x123),输出为
0001.0010.0011

您可以创建自己的 toBinaryString 方法。但首先你必须了解 << 运算符,它基本上将二进制数向左移动你给它的值。 示例:

int n = 1; // 0001
n = ( n<<(4-1) ); // shift the binary number of 1 to the left 3 times
System.out.println(toBinaryString(n)); // = 1000;

现在你可能会问这个有什么用?那么你可以在移位运算符的帮助下创建你自己的 toBinaryString 方法来做你想做的事

但在跳转到代码之前,您必须了解 & 运算符的工作原理: 1000 & 0001 = 0

public static String toBinaryString(int n) {
    String binary = ""; //Start with an empty String

    // int i in binary = 1000, as long as i > 0, divide by 2
    for (int i = (1 << (4 - 1)); i > 0; i /= 2) {

        // if binary n & i are NOT 0, add 1 to the String binary, Otherwise add 0
        binary += (n & i) != 0 ? "1" : "0";
    }
    return binary;
}

假设您将 1 作为输入:

toBinaryString(1); // 1 = 0001 二进制

函数开始:

i 从二进制值 1000 开始,等于 int 8 8比0大吗?是的,除以 2 8/2 = 4; 4 在二进制中是 00100,现在让我们将它与我们的输入 0001

进行比较

00100 & 0001 = 0? // 是

将 0 添加到二进制字符串。

现在将 4 除以 2 并重复循环。该函数将在末尾添加 3 个零和 1。那将是你的 0001。

循环二进制文件的末尾将是您想要的字符串形式的值。

希望我帮到了你

~穆斯塔法

让我们将一些 Streams, Collectors and RegEx 投入到我们的解决方案中以完成学习练习。

流/收集器/正则表达式解决方案:

import java.util.Arrays;
import java.util.Scanner;
import java.util.stream.Collectors;

class Binary
{
  public static void main( String[] args )
  {
    Scanner input = new Scanner( System.in );
    int number = input.nextInt();
    String binary = Integer.toBinaryString( number );
    System.out.println( binary );

    // SOLUTION:
    int digitsInGroup = 4;
    String separator = ".";
    while( binary.length() % digitsInGroup > 0 )
      binary = "0" + binary;
    binary = Arrays.stream( binary.split( String.format( "(?<=\G.{%d})", digitsInGroup ) ) ).collect( Collectors.joining( separator ) );
    System.out.println( binary );
  }
}

输出:

> java Binary.java
1
1
0001

> java Binary.java
16
10000
0001.0000

> java Binary.java
31000
111100100011000
0111.1001.0001.1000