2011-11-16 79 views
11

我想将整数转换为7位布尔二进制数组。到目前为止的代码不工作: 如果我输入说整数8要转换,而不是0001000我得到1000000,或说15我应该得到0001111,但我得到1111000.该char数组是不同的长度二进制数组和立场是错误的。整数到二进制数组

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

它是功课吗?通过2使用除法和余数。 – kan

+0

您是否尝试通过手动或使用调试程序遍历代码?如果你使用'8'作为输入,这两者都不应该是一个挑战,并且会让你看到你的结果开始偏离正确的地方。 –

回答

1

char-array只有需要的时间长,所以你的布尔数组可能会更长,并将位放在错误的位置。所以从后面开始,当你的char数组完成时,用0填充你的布尔数组,直到第一个位置。

2

提示:想想当你得到少于7个字符的字符表示时会发生什么。

特别是,请考虑char[]boolean[]阵列是如何“排队”的;一个会比另一个多一些,所以这些指数应该如何重合?


实际答案:目前您正在使用的字符数组的布尔数组,当您使用的是七字符串这是唯一正确的第一个元素的第一个元素。实际上,你希望数组的元素重合(使得零的前面不是末尾填充)。

解决此问题的一种方法是使用循环中的索引(例如,计算大小差异并改为修改binaryarray[i + offset])。但更简单的解决方案就是在第一行之后用零填充字符串,以确保在将其转换为char数组之前,它只有7个字符。

(额外的标志:当数组中有7个以上的字符时,你会怎么做,例如,如果有人通过200作为参数?基于上述两种解决方案,您应该能够轻松检测到这种情况并专门处理它)

3

当你做什么时你会得到System.out.println(maxAmpStr);是“1000”,如果是8.0 所以,你只会得到相关部分,你所期望的第一个“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; 
    } 
} 
0

Integer.toBinaryString(int i)不垫。对于例如Integer.toBinaryString(7)打印111不像您期望的00000111。在决定从何处开始填充布尔数组时,需要考虑到这一点。

+0

即使'toBinaryString'打印了'00000111',这个程序仍然是不正确的,因为索引仍然不会在char和boolean数组之间“排队”。 (事实上​​,它会失败,发生IndexOutOfBoundsException,尽管这可能会被微不足道地解决以避免潜在的问题。) –

24

真的没有必要处理这个字符串,只是做按位比较的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

+0

那么我对200多个'bits'感兴趣,所以这个解决方案不起作用。你能给一个建议吗?有没有办法使用'boolean []'('bits')或者我应该尝试'Strings'? –

0

15.ToBinaryString将“1111”

你是从第一个字符到最后一个字符,所以位(3)的第一个'1'进入binaryArray [0],我认为它应该是位0。

您定义垫ToBinaryString前导零至7(8?) 然后长度字符串逆向(或你的循环)

或者你可以停止摆弄字符串和简单的使用位明智的运营商

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

^=电力运营商或如果没有(1 < < 3)或任何Java中的左移。

11

我会使用这样的:

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; 
} 

号15与底座7会产生{FALSE,FALSE,FALSE,TRUE,真实,真实的,真} = 0001111b

数8,基部7 { FALSE,FALSE,FALSE,TRUE,FALSE,FALSE,FALSE} = 0001000b

+5

这里'base'的用法有点让人误解,因为二进制总是以2为底。也许'length'会更合适。事实上,你可以将'length'计算为'number'的ceiled 2的对数。 – Martijn

-1
public static String intToBinary(int num) { 
    int copy = num; 
    String sb = ""; 
    for(int i=30; i>=0; i--) { 
     sb = (copy&1) + sb; 
     copy = copy >>>=1; 
    } 
    return sb; 
} 
  1. 并用数字1
  2. 追加谷为字符串
  3. 做无符号右移 重复步骤1-3,对于i = 30..0
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
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

如果您可以进一步详细说明该代码片段的全部内容,那将会很好,这将会导致对未来观众更好的理解。 – Roylee

0

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

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; 
}