2011-11-16 69 views
11

Tôi đang cố chuyển đổi số nguyên thành mảng nhị phân Boolean 7 bit. Cho đến nay mã không hoạt động: Nếu tôi nhập số nguyên 8 được chuyển đổi, thay vì 0001000 tôi nhận được 1000000, hoặc nói 15 tôi sẽ nhận được 0001111 nhưng tôi nhận được 1111000. Mảng char có độ dài khác với mảng nhị phân và các vị trí sai.Số nguyên cho mảng nhị phân

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

Mọi trợ giúp đều được đánh giá cao.

+1

Bài tập về nhà phải không? Sử dụng phân chia và phần còn lại theo 2. – kan

+0

Bạn đã thử đi qua mã của mình, bằng tay hoặc bằng trình gỡ rối? Không nên là một thách thức nếu bạn sử dụng '8' làm đầu vào, và sẽ cho bạn biết kết quả của bạn bắt đầu đi lệch từ đâu. –

Trả lời

1

Mảng char chỉ là cần thiết, vì vậy mảng boolean của bạn có thể dài hơn và đặt các bit vào vị trí sai. Vì vậy, bắt đầu từ phía sau, và khi mảng char của bạn kết thúc, điền vào mảng boolean của bạn với 0 cho đến vị trí đầu tiên.

2

Gợi ý: Hãy suy nghĩ về những gì sẽ xảy ra khi bạn nhận được biểu diễn ký tự ít hơn bảy ký tự.

Cụ thể, hãy nghĩ về cách các dòng char[]boolean[] mảng "xếp hàng"; sẽ có các yếu tố phụ trong cái khác hơn, vậy các chỉ số nên trùng khớp như thế nào?


câu trả lời thực tế: Hiện tại bạn đang sử dụng phần tử đầu tiên của mảng nhân vật là yếu tố đầu tiên của mảng boolean, mà chỉ đúng khi bạn đang sử dụng một chuỗi bảy nhân vật. Trong thực tế, bạn muốn các thành phần cuối cùng của các mảng trùng khớp (để các số 0 được đệm ở phía trước không phải ở cuối).

Một cách để tiếp cận vấn đề này là chơi xung quanh với các chỉ số trong vòng lặp (ví dụ: tìm ra sự khác biệt về kích thước và sửa đổi binaryarray[i + offset] thay thế). Nhưng một giải pháp đơn giản hơn là chỉ cần để lại pad chuỗi với số không sau dòng đầu tiên, để đảm bảo chính xác bảy ký tự trước khi chuyển đổi nó thành mảng char.

(Dấu phụ: bạn làm gì khi có hơn 7 ký tự trong mảng, ví dụ: nếu ai đó vượt qua 200 làm đối số? Dựa trên cả hai giải pháp trên, bạn sẽ có thể dễ dàng phát hiện trường hợp này và xử lý nó một cách cụ thể .)

3

Những gì bạn nhận được khi bạn làm System.out.println(maxAmpStr); là "1000" trong trường hợp của 8. Vì vậy, bạn chỉ nhận được phần có liên quan, "0000" đầu tiên mà bạn mong đợi chỉ được bổ sung.

Nó không đẹp nhưng những gì bạn có thể làm là:

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) không pad. Ví dụ: Integer.toBinaryString(7) in 111 không phải 00000111 như bạn mong đợi. Bạn cần tính đến điều này khi quyết định nơi bắt đầu điền vào mảng boolean của bạn.

+0

Ngay cả khi 'toBinaryString' được in '00000111', chương trình này vẫn sẽ không chính xác vì các chỉ mục sẽ không" xếp hàng "giữa mảng char và boolean. (Trong thực tế nó sẽ thất bại với một IndexOutOfBoundsException, mặc dù đó có thể được cố định tầm thường để rời khỏi vấn đề cơ bản.) –

24

Có thực sự không cần để đối phó với chuỗi cho điều này, chỉ cần làm so sánh Bitwise trong 7 bit bạn quan tâm.

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 cho là một ví dụ ngắn gọn nhưng câu trả lời của bạn có thể làm với một lời giải thích cho lý do tại sao OP không hoạt động. – Radiodef

+0

Tôi cũng quan tâm đến hơn 200 bit 'để giải pháp này không hoạt động. Bạn có thể đưa ra lời khuyên không? Có cách nào để làm việc với 'boolean []' ('bits') hay tôi nên thử' Strings'? –

0

15.ToBinaryString sẽ là '1111'

Bạn đang lopping thông qua đó từ đầu đến cuối ký tự, do đó, đầu tiên '1' đó là bit (3) là đi vào binaryArray [0] mà tôi giả định là bit 0.

Bạn định nghĩa để pad ToBinaryString với số không dẫn đến chiều dài 7 (8 ??) và sau đó đảo ngược chuỗi, (hoặc vòng lặp của bạn)

Hoặc bạn có thể dừng lại rối tung lên với chuỗi và chỉ cần sử dụng chút nhà khai thác khôn ngoan

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

^= nhà điều hành điện hoặc nếu không (1 < < 3) hoặc bất kỳ điều gì còn lại là thay đổi trong Java.

11

Tôi sẽ sử dụng này:

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

số 15 với cơ sở 7 sẽ tạo ra {sai sự thật, sai sự thật, sai sự thật, sự thật, sự thật, sự thật, đúng} = 0001111b

số 8, cơ sở 7 { sai sự thật, sai sự thật, sai sự thật, đúng, sai, sai sự thật, sai} = 0001000b

+5

Việc sử dụng 'base' ở đây là một chút sai lệch, vì nhị phân luôn là cơ sở 2. Có lẽ' length' sẽ phù hợp hơn. Trong thực tế, bạn có thể tính toán 'length' như logarit cơ bản 2 của số'. – 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. VÀ số với 1
  2. Nối các thung lũng thành một chuỗi
  3. làm unsigned phải thay đổi lặp lại bước 1-3 cho 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

nó sẽ rất tuyệt nếu bạn có thể xây dựng thêm những gì mà đoạn mã tất cả về, điều đó sẽ dẫn đến sự hiểu biết tốt hơn cho người xem trong tương lai. – Roylee

0

Vì không ai ở đây có một câu trả lời với một mảng động length, đây là giải pháp của tôi:

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; 
} 
Các vấn đề liên quan