整数转二进制数组

17
我想将一个整数转换为由7位布尔二进制数组成的序列。目前代码无法正常工作:例如,当我输入整数8进行转换时,期望得到0001000,但实际得到的是1000000;当我输入整数15时期望得到0001111,但实际得到的是1111000。字符数组的长度与二进制数组的长度不同,并且位置也不正确。
public static void main(String[] args){

    String maxAmpStr = Integer.toBinaryString(8);
    char[] arr = maxAmpStr.toCharArray();
    boolean[] binaryarray = new boolean[7];
    for (int i=0; i<maxAmpStr.length(); i++){
        if (arr[i] == '1'){             
            binaryarray[i] = true;  
        }
        else if (arr[i] == '0'){
            binaryarray[i] = false; 
        }
    }

    System.out.println(maxAmpStr);
    System.out.println(binaryarray[0]);
    System.out.println(binaryarray[1]);
    System.out.println(binaryarray[2]);
    System.out.println(binaryarray[3]);
    System.out.println(binaryarray[4]);
    System.out.println(binaryarray[5]);
    System.out.println(binaryarray[6]);
}

任何帮助都将不胜感激。


1
这是作业吗?使用除法和取模运算符求解。 - kan
你是否尝试过手动或使用调试器来遍历你的代码?如果你使用8作为输入,这两种方法都不应该是一项挑战,并且将让你看到你的结果从何处开始偏离正确。 - Andrzej Doyle
11个回答

39

实际上,针对这个问题没有必要使用字符串,只需对你感兴趣的7位进行按位比较即可。

public static void main(String[] args) {

    int input = 15;

    boolean[] bits = new boolean[7];
    for (int i = 6; i >= 0; i--) {
        bits[i] = (input & (1 << i)) != 0;
    }

    System.out.println(input + " = " + Arrays.toString(bits));
}

4
+1 是一个简明的例子,但你的回答需要解释为什么 OP 的方法不起作用。 - Radiodef
我对200多个“位”感兴趣,所以这个解决方案不适用。你能给些建议吗?有没有办法使用“boolean[]”(“位”)或者我应该尝试使用“Strings”? - Lazar Lazarov

15

我会使用这个:

private static boolean[] toBinary(int number, int base) {
    final boolean[] ret = new boolean[base];
    for (int i = 0; i < base; i++) {
        ret[base - 1 - i] = (1 << i & number) != 0;
    }
    return ret;
}

以7为底的数15会产生{false, false, false, true, true, true, true} = 0001111b

数字8在7进制下为{false, false, false, true, false, false, false} = 0001000b


6
这里使用“base”有些误导性,因为二进制始终是基数2。也许“长度”会更恰当。实际上,您可以将“长度”计算为“数字”的以2为底的对数向上取整的结果。 - Martijn

3
提示: 当您获得一个字符表示少于七个字符时会发生什么,特别是考虑到char[]和boolean[]数组的“对齐”;其中一个将有额外的元素,那么索引应该如何重合?
实际答案: 目前您正在使用字符数组的第一个元素作为布尔数组的第一个元素,这只在使用七个字符的字符串时正确。实际上,您希望数组的最后一个元素相符(以便零填充在前而不是在末尾)。
解决此问题的一种方法是在循环中玩弄索引(例如,计算出大小差异并修改binaryarray[i+offset])。但更简单的解决方案是在第一行后向左填充字符串以确保它在转换为char数组之前恰好是七个字符。
(加分项:当数组中有超过7个字符的情况时该怎么办,例如如果有人将200作为参数传递进来?根据上述两种解决方案,您应该能够轻松检测到这种情况并具体处理。)

3

由于这里没有一个动态数组长度的答案,所以这是我的解决方案:

public static boolean[] convertToBinary(int number) {
    int binExpo = 0;
    int bin = 1;
    while(bin < number) { //calculates the needed digits
        bin = bin*2;
        binExpo++;
    }
    bin = bin/2;
    boolean[] binary = new boolean[binExpo]; //array with the right length
    binExpo--;
    while(binExpo>=0) {
        if(bin<=number) {
            binary[binExpo] = true;
            number =number -bin;
            bin = bin/2;
        }else {
            binary[binExpo] = false;
        }
        binExpo--;
    }
    return binary;
}

1
使用以下公式可以找出位数组的大小:⌊log2(n)⌋ + 1,其中⌊x⌋表示x的下取整。- https://www.exploringbinary.com/number-of-bits-in-a-decimal-integer/ - Enrico Giurin
1
所需的大小只是 32 - Integer.numberOfLeadingZeros(value),但是这段代码本身就不可靠,因为当使用了所有的32位时它无法正常工作(因为该值会被解释为负数)。 - undefined

3
当您执行System.out.println(maxAmpStr);时,如果是8,则获得的结果为“1000”。因此,您只会得到相关部分,“0000”被省略了。
虽然不太美观,但您可以这样做:
for (int i=0; i<maxAmpStr.length(); i++)
{
    if (arr[i] == '1')
    {
        binaryarray[i+maxAmpStr.length()-1] = true;
    }
    else if (arr[i] == '0')
    {
        binaryarray[i+maxAmpStr.length()-1] = false;
    }
}

1

字符数组的长度仅限于所需长度,因此您的布尔数组可能会更长,并将位放置在错误的位置。因此,请从后面开始,当您的字符数组完成时,用0填充您的布尔数组直到第一个位置。


0

Integer.toBinaryString(int i) 方法不会填充前导零。例如,Integer.toBinaryString(7) 输出的是 111 而不是你期望的 00000111。在决定从哪里开始填充布尔数组时,需要考虑这一点。


即使 toBinaryString 打印出 00000111,这个程序仍然是不正确的,因为字符数组和布尔数组之间的索引仍然不会“对齐”。(实际上,它将失败并抛出 IndexOutOfBoundsException 异常,尽管可以轻松地修复底层问题。) - Andrzej Doyle

0

15.ToBinaryString 将会是 '1111'

你正在从第一个字符循环到最后一个字符,所以第一个位于 bit(3) 的 '1' 将进入 binaryArray[0],我假设它应该是位 0。

你需要在 ToBinaryString 前面填充前导零,使其长度为 7(8?),然后反转字符串(或者你的循环)

或者你可以停止使用字符串并直接使用位运算符

BinaryArray[3] = (SomeInt && 2^3 != 0);

^ = 幂运算符,如果不是(1 << 3)或 Java 中的左移。


你是不是想说 Integer.toBinaryString(15)?如果是的话,您能否编辑一下这个答案呢?那是一个很好的方法。 - Pasupathi Rajamanickam
不是Java方面的人,所以我甚至不知道你是否正确。不过我认为这个想法很清楚。 - Tony Hopkinson

0
  public static boolean[] convertToBinary(int b){
    boolean[] binArray = new boolean[7];
    boolean bin;
    for(int i = 6; i >= 0; i--) {
      if (b%2 == 1) bin = true;
      else bin = false;
      binArray[i] = bin;
      b/=2;
    }
    return binArray;
  }

1
当使用(b&1)代替b%1b>>>=1代替b/=2时,可以将此扩展为支持所有32位。除此之外,当你可以一开始就写variable = condition;时,没有必要写if(condition) variable = true; else variable = false;。甚至可以摆脱过时的bin变量,写成binArray[i] = (b&1) != 0; - undefined

-1
String maxAmpStr = Integer.toBinaryString(255);
    char[] arr = maxAmpStr.toCharArray();
    boolean[] binaryarray = new boolean[20];
    int pivot = binaryarray.length - arr.length;
    int j = binaryarray.length - 1;
    for (int i = arr.length - 1; i >= 0; i--) {
        if (arr[i] == '1') {
            binaryarray[j] = true;
        } else if (arr[i] == '0') {
            binaryarray[j] = false;
        }
        if (j >= pivot)
            j--;
    }

    System.out.println(maxAmpStr);
    for (int k = 0; k < binaryarray.length; k++)
        System.out.println(binaryarray[k]);
}

1
如果您能进一步阐述代码片段的含义,那将有助于未来观众更好地理解。这会很不错。 - Roy Lee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接