2011-11-16 48 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; 
}