Cách chuyển đổi chuỗi nhị phân thành số nguyên cơ sở 10 trong Java


108

Tôi có một mảng 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ố cơ sở 10 tương ứng của chúng. Xem xét:

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 tìm thấy phương pháp chuyển đổi trực tiếp. Integer.parseInt(b)mang lại một 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 một tham số cho cơ sở đầu ra. toBinaryStringchuyển đổi có sai hướng không. Tôi nghi ngờ rằng tôi sẽ cần thực hiện chuyển đổi nhiều bước, nhưng dường như không thể tìm thấy sự kết hợp phù hợp của các phương thức hoặc lớp con. Tôi cũng không chắc chắn mức độ mà các số 0 đứng đầu hoặc thiếu chúng sẽ là một vấn đề. Có ai có bất kỳ hướng dẫn tốt để chỉ cho tôi?



Câu trả lời:


263

Bạn cần xác định cơ số . 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 trong tài liệu parseInt cho phép tính cơ số. Hoạt động như một giấc mơ.
dwwilson66

1
Điều này có hoạt động với các số 0 ở đầ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

Ví dụ về @NagabhushanBaddi? Bạn có đang vượt qua đại diện phần bù của hai không?
Matt Ball

18

Điều này có thể hoạt động:

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

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

6
cái này rất có ích đối với 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 đã có java
bucksnort2

Có ai thử nghiệm điều này trước khi? ở đây number. độ dài trừ đi chỉ số cộng với 1 được nhân với 2, nếu tôi không nhầm ở bậc một, bạn bắt đầu với 1 và nhân giá trị đó với 2 sau đó lấy kết quả và nhân một với 2 sẽ được 3 vị trí của bạn và như vậy trên
Christopher Cabezudo Rodriguez

(Ô BÌNH LUẬN KHÔNG TỐT CHO SNIPPETS) Đây là mã mà tôi đang sử dụng cơ sở trong cơ sở của bạn (Tôi đã bị mất và sử dụng mã của bạn làm mẫu) public static int binaryToInteger (Chuỗi nhị phân) {char [] number = binary.ToCharArray (); int kết quả = 0; int posValue = 1; for (int i = number.Length - 1; i> = 0; i--) {if (number [i] == '1') {result + = posValue; } posValue * = 2; } trả về kết quả; }
Christopher Cabezudo Rodriguez

1
Đoạn mã này không hoạt động. forvòng lặp và cách tính resultbiến mới không đúng.
trylimits

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

hoạt động tốt nếu bạn đang xử lý các số dương nhưng nếu bạn cần xử lý các số có dấu, bạn có thể cần ký mở rộng chuỗi của mình sau đó chuyển đổi thành 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!


1
Tôi cần -1 chuyển đổi từ nhị phân sang thập phân, tôi đã làm điều này. System.out.println ((int) Long.parseLong ("11111111111111111111111111111111", 2));
Zeus

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

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 còn chán hơn! Đã sửa đổi câu trả lời của Hassan để hoạt động chính xác.


1

Đối với tôi, tôi nhận được NumberFormatException khi cố gắng giải quyết các số âm. Tôi đã sử dụng như sau cho các số âm và số dương.

System.out.println(Integer.parseUnsignedInt("11111111111111111111111111110111", 2));      

Output : -9

0

Đã sửa phiên bản Integer.parseInt (text) của java để hoạt động 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

Tôi yêu vòng lặp! Yay!

String myString = "1001001"; //73

Vòng lặp while với bộ tích lũy, từ trái sang phải ( lkhô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;

Từ phải sang trái với 2 vars vòng lặp, lấy cảm hứng từ Chuyển đổi boolean sang int trong Java (hoàn toàn kinh khủng):

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;

Một cách triển khai hợp lý hơn một chút:

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

Nếu bạn lo lắng về hiệu suất Integer.parseInt()Math.pow()quá đắt. Bạn có thể sử dụng thao tác bit để làm điều tương tự nhanh gấp đôi (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;
}

Đầu ra:

 Input Number: 87 toBinary 1010111
Output Number: 87 toBinary 1010111
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.