【问题标题】:Mixing the characters in a String (changing order of binary results)混合字符串中的字符(更改二进制结果的顺序)
【发布时间】:2019-11-22 16:55:31
【问题描述】:

我正在做一个这样的练习:给定一个具有 n 位的自然数 x > 0,我们用 xn−1…x0 表示它在底数 2 中的表示。例如,底数 2 中的 x = 8 是 1000,所以 x3 = 1 和 x2 = x1 = x0 = 0。

编写一个程序,将两个给定自然数 x 和 y 的基数 2 表示与相同的位数 n 混合。即打印 xn−1 yn−1 … x0 y0。

我有一个程序可以计算 2 个 int 数字的二进制表达式并将两个二进制文件一起打印。我需要做的是改变 0 和 1 的顺序。 比如我输入2个数字(10, 15)我会得到1010 1111,但是我想把这些数字按这个顺序混合:

  1. 起初我想要每个二进制的第一个数字 (11)
  2. 然后是每个二进制的第二个数字(01)
  3. 每个二进制的第三个数字 (11)
  4. 每个二进制的第四个数字 (01)

我有这段代码可以打印 2 个十进制数字的二进制,但它缺少混合部分。我已经尝试过使用 charAt(这就是我使用字符串作为二进制数的原因),但我无法让它工作。

Scanner scanner = new Scanner(System.in);
        int num = scanner.nextInt();
        int num2 = scanner.nextInt();
        String bin = "";
        String bin2 = "";
        if (num > 0) {
            while (num > 0) {
                if (num % 2 == 0) {
                    bin = "0" + bin;
                } else {
                    bin = "1" + bin;
                }
                num = (int) num / 2;
            }
        } else if (num == 0) {
            bin = "0";
        }

        if (num2 > 0) {
            while (num2 > 0) {
                if (num2 % 2 == 0) {
                    bin2 = "0" + bin2;
                } else {
                    bin2 = "1" + bin2;
                }
                num2 = (int) num2 / 2;
            }
        } else if (num2 == 0) {
            bin2 = "0";
        } 

        System.out.print(bin+bin2);

【问题讨论】:

  • 是否需要在飞行中进行混合部分,或者您可以在将您的数字带到基数 2 后进行?
  • 如果你是这个意思,我想我需要将我的数字以 2 为底进行混合。
  • 我想说的是你有两个选择。第一个是将你的数字以 2 为底,得到 2 个字符串,然后混合这些字符串,或者在计算值时进行混合部分。
  • 如果你的二进制文件的字符串表示有不同的长度怎么办,例如2= 10 and 128 = 10000000你想如何混合它们?
  • 这在练习中没有指定,但它只需要更改每个二进制文件的相同位数的顺序。如果二进制 1 有 4 位,二进制 2 有 5,我将只更改数字的匹配数量(4)。

标签: java loops binary


【解决方案1】:

鉴于两个数字在二进制表示中的长度应该相同,这里有两种方法可以进行混合。

这个是将两个数字都转换为位,然后进行混合

class Base2Mix1 {

    public static void main(String[] args) {
        int first = 10;
        int second = 15;

        String firstBits = baseTwoRepresentation(first);
        String secondBits = baseTwoRepresentation(second);

        int length = firstBits.length();

        char[] mixed = new char[length * 2];
        for (int i = 0; i < length; i++) {
            mixed[i * 2] = firstBits.charAt(i);
            mixed[i * 2 + 1] = secondBits.charAt(i);
        }

        System.out.println(new String(mixed));
    }

    private static String baseTwoRepresentation(int num) {
        StringBuilder sb = new StringBuilder();
        while(num > 0) {
            sb.append(num % 2);
            num /= 2;
        }
        return sb.reverse().toString();
    }

}

这是在转换过程中做混合部分的版本

class Base2Mix2 {
    public static void main(String[] args) {
        int first = 10;
        int second = 15;

        String mixedBits = mixedBits(first, second);
        System.out.println(mixedBits);
    }

    private static String mixedBits(int first, int second) {
        StringBuilder stringBuilder = new StringBuilder();

        while(first > 0 && second > 0) {
            stringBuilder
                    .append(second % 2)
                    .append(first % 2);

            first /= 2;
            second /= 2;
        }

        return stringBuilder.reverse().toString();
    }
}

【讨论】:

  • 这对我有用,但我不能为此使用方法或 Stringbuilder。我只使用循环。
  • 那么你可以使用 String
猜你喜欢
  • 2021-07-25
  • 2016-09-21
  • 2018-08-30
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
  • 2011-07-11
  • 2012-01-03
  • 1970-01-01
相关资源
最近更新 更多