2012-04-16 36 views
61

Tôi có một chuỗi các chuỗi đại diện cho số nhị phân (không có số 0 đầu) mà tôi muốn chuyển đổi thành số 10 tương ứng. Hãy xem xét:Làm thế nào để chuyển đổi một chuỗi nhị phân thành số nguyên cơ bản 10 trong Java

binary 1011 becomes integer 11 
binary 1001 becomes integer 9 
binary 11 becomes integer 3 etc. 

Cách tốt nhất để tiếp tục là gì? Tôi đã khám phá java.lang.number. * Mà không cần tìm phương thức chuyển đổi trực tiếp. Integer.parseInt(b) mang lại số nguyên EQUAL cho Chuỗi ... ví dụ: 1001 trở thành 1.001 thay vì 9 ... và dường như không bao gồm thông số cho cơ sở đầu ra. toBinaryString chuyển đổi sai hướng. Tôi nghi ngờ tôi sẽ cần phải làm một chuyển đổi multistep, nhưng dường như không thể tìm thấy sự kết hợp của các phương pháp hoặc các lớp con. Tôi cũng không chắc chắn mức độ mà số không đứng đầu hoặc thiếu số đó sẽ là một vấn đề. Bất cứ ai có bất kỳ hướng dẫn tốt để chỉ cho tôi?

+4

Nhìn vào [Integer # parseInt (Chuỗi s, int radix)] (http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Integer.html#parseInt%28java.lang.String,%20int%29) – anubhava

+0

có thể trùng lặp [chuyển đổi số nhị phân thành số thập phân] (http://stackoverflow.com/qu estions/2115346/chuyển đổi-nhị phân-số-in-to-số thập phân) –

Trả lời

166

Bạn cần phải specify the radix. Có quá tải Integer#parseInt() cho phép bạn.

int foo = Integer.parseInt("1001", 2); 
+1

Sự hoàn hảo. Tôi hoàn toàn bỏ lỡ dòng thứ hai trên tài liệu parseInt cho phép cho cơ số. Làm việc như một giấc mơ. – dwwilson66

+1

Tính năng này có hoạt động với các số 0 đứng đầu không? Chỉ cần xác nhận, mặc dù tôi không thấy lý do tại sao không. – Siddhartha

15

này có thể làm việc:

public int binaryToInteger(String binary) { 
    char[] numbers = binary.toCharArray(); 
    int result = 0; 
    for(int i=numbers.length - 1; i>=0; i--) 
     if(numbers[i]=='1') 
      result += Math.pow(2, (numbers.length-i - 1)); 
    return result; 
} 
+8

-1 để tái phát minh bánh xe một cách không cần thiết. –

+0

Tôi cho rằng đó là loại không cần thiết. Đó là những gì xảy ra khi bạn có một chút thời gian giữa các lớp học. – Hassan

+5

cái này hữu ích cho tôi bởi vì tôi phải làm một dự án trường học với các chuyển đổi mà không sử dụng những cái java đã có – bucksnort2

2
public Integer binaryToInteger(String binary){ 
    char[] numbers = binary.toCharArray(); 
    Integer result = 0; 
    int count = 0; 
    for(int i=numbers.length-1;i>=0;i--){ 
     if(numbers[i]=='1')result+=(int)Math.pow(2, count); 
     count++; 
    } 
    return result; 
} 

Tôi đoán tôi thậm chí còn chán hơn! Câu trả lời của Hassan đã được sửa đổi để hoạt động chính xác.

4
int foo = Integer.parseInt("1001", 2); 

công trình chỉ tốt nếu bạn đang đối phó với những con số tích cực nhưng nếu bạn cần để đối phó với số ký bạn có thể cần phải đăng ký mở rộng chuỗi của bạn sau đó chuyển sang một Int

public class bit_fun { 
    public static void main(String[] args) { 
     int x= (int)Long.parseLong("FFFFFFFF", 16); 
     System.out.println("x =" +x);  

     System.out.println(signExtend("1")); 
     x= (int)Long.parseLong(signExtend("1"), 2); 
     System.out.println("x =" +x); 

     System.out.println(signExtend("0")); 
     x= (int)Long.parseLong(signExtend("0"), 2); 
     System.out.println("x =" +x); 

     System.out.println(signExtend("1000")); 
     x= (int)Long.parseLong(signExtend("1000"), 2); 
     System.out.println("x =" +x); 

     System.out.println(signExtend("01000")); 
     x= (int)Long.parseLong(signExtend("01000"), 2); 
     System.out.println("x =" +x); 
    } 

    private static String signExtend(String str){ 
     //TODO add bounds checking 
     int n=32-str.length(); 
     char[] sign_ext = new char[n]; 
     Arrays.fill(sign_ext, str.charAt(0)); 

     return new String(sign_ext)+str; 
    } 
} 

output: 
x =-1 
11111111111111111111111111111111 
x =-1 
00000000000000000000000000000000 
x =0 
11111111111111111111111111111000 
x =-8 
00000000000000000000000000001000 
x =8 

Tôi hy vọng rằng sẽ giúp !

5
static int binaryToInt (String binary){ 
    char []cA = binary.toCharArray(); 
    int result = 0; 
    for (int i = cA.length-1;i>=0;i--){ 
     //111 , length = 3, i = 2, 2^(3-3) + 2^(3-2) 
     //     0   1 
     if(cA[i]=='1') result+=Math.pow(2, cA.length-i-1); 
    } 
    return result; 
} 
-1

Tôi yêu vòng! Yay!

String myString = "1001001"; //73 

Trong khi vòng lặp với accumulator, trái sang phải (l không thay đổi):

int n = 0, 
    j = -1, 
    l = myString.length(); 
while (++j < l) n = (n << 1) + (myString.charAt(j) == '0' ? 0 : 1); 
return n; 

phải sang trái bằng 2 vars vòng lặp, lấy cảm hứng từ Convert boolean to int in Java (hoàn toàn khủng khiếp):

int n = 0, 
    j = myString.length, 
    i = 1; 
while (j-- != 0) n -= (i = i << 1) * new Boolean(myString.charAt(j) == '0').compareTo(true); 
return n >> 1; 

Triển khai có phần hợp lý hơn:

int n = 0, 
    j = myString.length(), 
    i = 1; 
while (j-- != 0) n += (i = i << 1) * (myString.charAt(j) == '0' ? 0 : 1); 
return n >> 1; 

Một phiên bản có thể đọc được: p

int n = 0; 
for (int j = 0; j < myString.length(); j++) { 
    n *= 2; 
    n += myString.charAt(j) == '0' ? 0 : 1; 
} 
return n; 
0

cố định phiên bản của java của Integer.parseInt (văn bản) để làm việc với số âm:

public static int parseInt(String binary) { 
    if (binary.length() < Integer.SIZE) return Integer.parseInt(binary, 2); 

    int result = 0; 
    byte[] bytes = binary.getBytes(); 

    for (int i = 0; i < bytes.length; i++) { 
     if (bytes[i] == 49) { 
      result = result | (1 << (bytes.length - 1 - i)); 
     } 
    } 

    return result; 
} 
0

Nếu bạn đang lo lắng về hiệu suất, Integer.parseInt()Math.pow() là quá đắt.Bạn có thể sử dụng thao tác bit để làm điều tương tự nhanh gấp hai lần (dựa trên kinh nghiệm của tôi):

final int num = 87; 
String biStr = Integer.toBinaryString(num); 

System.out.println(" Input Number: " + num + " toBinary "+ biStr); 
int dec = binaryStringToDecimal(biStr); 
System.out.println("Output Number: " + dec + " toBinary "+Integer.toBinaryString(dec)); 

đâu

int binaryStringToDecimal(String biString){ 
    int n = biString.length();  
    int decimal = 0; 
    for (int d = 0; d < n; d++){ 
    // append a bit=0 (i.e. shift left) 
    decimal = decimal << 1; 

    // if biStr[d] is 1, flip last added bit=0 to 1 
    if (biString.charAt(d) == '1'){ 
     decimal = decimal | 1; // e.g. dec = 110 | (00)1 = 111 
    } 
    } 
    return decimal; 
} 

Output:

Input Number: 87 toBinary 1010111 
Output Number: 87 toBinary 1010111 
Các vấn đề liên quan