Cara mengonversi String Biner menjadi bilangan bulat 10 di Java

108

Saya memiliki array String yang mewakili bilangan Biner (tanpa nol di depan) yang ingin saya ubah ke bilangan basis 10 yang sesuai. Mempertimbangkan:

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

Apa cara terbaik untuk melanjutkan? Saya telah menjelajahi java.lang.number. * Tanpa menemukan metode konversi langsung. Integer.parseInt(b)menghasilkan integer yang SAMA dengan String ... misalnya, 1001 menjadi 1.001, bukan 9 ... dan tampaknya tidak menyertakan parameter untuk basis keluaran. toBinaryStringapakah konversi ke arah yang salah. Saya rasa saya perlu melakukan konversi beberapa langkah, tetapi tidak dapat menemukan kombinasi yang tepat dari metode atau subclass. Saya juga tidak yakin sejauh mana angka nol di depan atau ketiadaan akan menjadi masalah. Adakah yang punya petunjuk arah yang baik untuk menunjukkan saya?

dwwilson66
sumber
kemungkinan duplikat untuk mengubah Bilangan Biner menjadi bilangan desimal
Mike Samuel

Jawaban:

263

Anda perlu menentukan radix . Ada kelebihan Integer#parseInt()yang memungkinkan Anda melakukannya.

int foo = Integer.parseInt("1001", 2);
Matt Ball
sumber
1
Kesempurnaan. Saya benar-benar melewatkan baris kedua pada dokumentasi parseInt yang memungkinkan untuk radix. Bekerja seperti mimpi.
dwwilson66
1
Apakah ini juga berfungsi dengan nol di depan? Hanya mengkonfirmasikan, meskipun saya tidak melihat alasan mengapa tidak.
Siddhartha
@NagabhushanBaddi contoh? Apakah Anda melewati representasi komplemen dua?
Matt Ball
18

Ini mungkin berhasil:

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;
}
Hassan
sumber
Saya kira itu tidak perlu. Itulah yang terjadi jika Anda memiliki sedikit waktu di antara kelas.
Hassan
6
yang satu ini bermanfaat bagi saya karena saya harus melakukan proyek sekolah dengan konversi tanpa menggunakan yang sudah dimiliki java
bucksnort2
Apakah ada yang menguji ini sebelumnya? di sini nomor panjang dikurangi indeks ditambah 1 telah dikalikan dengan 2, jika saya tidak salah di bynary Anda mulai dengan 1 dan mengalikan nilai itu dengan 2 kemudian ambil hasilnya dan kalikan satu dengan 2 yang akan menjadi tempat 3 Anda dan seterusnya pada
Christopher Cabezudo Rodriguez
(KOTAK KOMENTAR TIDAK BAIK UNTUK SNIPPET) Di sini Kode yang saya gunakan basis di milik Anda (saya hilang dan menggunakan milik Anda sebagai template) public static int binaryToInteger (String binary) {char [] numbers = binary.ToCharArray (); hasil int = 0; int posValue = 1; untuk (int i = bilangan.Length - 1; i> = 0; i--) {if (numbers [i] == '1') {result + = posValue; } posValue * = 2; } hasil pengembalian; }
Christopher Cabezudo Rodriguez
1
Potongan kode ini tidak berfungsi. forloop dan perhitungan resultvariabel baru tidak benar.
batas percobaan
8
int foo = Integer.parseInt("1001", 2);

berfungsi dengan baik jika Anda berurusan dengan bilangan positif tetapi jika Anda perlu berurusan dengan nomor yang ditandatangani, Anda mungkin perlu menandatangani memperpanjang string Anda kemudian mengubahnya menjadi 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 

Saya harap itu membantu!

txcotrader.dll
sumber
1
Saya perlu -1 dikonversi dari biner ke desimal, saya melakukan ini. 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;
}
Rudy Duran
sumber
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;
}

Saya rasa saya bahkan lebih bosan! Jawaban Hassan yang dimodifikasi agar berfungsi dengan benar.

ModernIncantations
sumber
1

Bagi saya, saya mendapat NumberFormatException saat mencoba menangani angka negatif. Saya menggunakan yang berikut untuk angka negatif dan positif.

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

Output : -9
Zeus
sumber
0

Versi Java's Integer.parseInt (teks) telah diperbaiki agar berfungsi dengan angka negatif:

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;
}
skyrosbit
sumber
0

Saya suka loop! Yay!

String myString = "1001001"; //73

While loop dengan akumulator, kiri ke kanan ( ltidak berubah):

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

Kanan ke kiri dengan 2 loop vars, terinspirasi oleh Convert boolean to int di Java (benar-benar mengerikan):

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;

Implementasi yang agak lebih masuk akal:

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

Versi yang dapat dibaca: p

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

Jika Anda khawatir tentang kinerja, Integer.parseInt()dan Math.pow()terlalu mahal. Anda dapat menggunakan manipulasi bit untuk melakukan hal yang sama dua kali lebih cepat (berdasarkan pengalaman saya):

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

Dimana

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

Keluaran:

 Input Number: 87 toBinary 1010111
Output Number: 87 toBinary 1010111
anask
sumber