Как преобразовать двоичное значение строки в десятичное

Как преобразовать двоичную строку, такую ​​как

String c = "110010"; // as binary

к значению в десятичном формате в Java? (ожидаемый результат в примере 50)

16 ответов

Решение

Использование Integer.parseInt (см. Javadoc), который преобразует ваш String в int используя базу два:

int decimalValue = Integer.parseInt(c, 2);
public static int integerfrmbinary(String str){
    double j=0;
    for(int i=0;i<str.length();i++){
        if(str.charAt(i)== '1'){
         j=j+ Math.pow(2,str.length()-1-i);
     }

    }
    return (int) j;
}

Этот кусок кода я написал вручную. Вы также можете использовать parseInt, как указано выше. Эта функция даст десятичное значение, соответствующее двоичной строке:)

Я думаю, что вы ищете Integer.parseInt. Второй аргумент принимает основание, которое в этом случае равно 2.

Integer.parseInt(c, 2)
int i = Integer.parseInt(c, 2);
int num = Integer.parseInt("binaryString",2);

Нужно думать о десятичной точности, поэтому вы должны ограничить длину цепочки битов. В любом случае, использование BigDecimal - хороший выбор.

public BigDecimal bitStringToBigDecimal(String bitStr){

    BigDecimal sum = new BigDecimal("0");
    BigDecimal base = new BigDecimal(2);
    BigDecimal temp;
    for(int i=0;i<bitStr.length();i++){
        if(bitStr.charAt(i)== '1'){
            int exponent= bitStr.length()-1-i;
            temp=base.pow(exponent);
            sum=sum.add(temp);
        }

    }
    return sum;
}
public static Long binToDec(String bin) {
long dec = 0L;
    long pow = 1L;
    for (int i = (bin.length() - 1); i >= 0; i--) {
        char c = bin.charAt(i);
        dec = dec + (Long.parseLong(c + "") * pow);
        pow = pow * 2;
    }
    return dec;
}

или же

long num = Long.parseLong("101110111",2);

скажем так23456789

у него есть двоичная строка1011001011110110000010101

Самый простой способ — разместить все необходимые копии базы слева, которые всегда должны бытьstring length - 1(предполагая, что передний фронт не равен нулю), поместите и все коэффициенты справа:

      echo '1011001011110110000010101' | 

        mawk 'function __(_) {
      
      print; gsub(/./, "2*(", _)
      return substr(_,   4)
  }
  $!_ = __($_) $!_' FS= OFS=')+' | gtee >( gcat -b | lgp3 >&2; ) | bc 

      23456789
1011001011110110000010101

       2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(
 +1)+0)+1)+1)+0)+0)+1)+0)+1)+1)+1)+1)+0)+1)+1)+0)+0)+0)+0)+0)+1)+0)+1)+0)+1

 2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(
  1)  )+1)+1)  )  )+1)  )+1)+1)+1)+1)  )+1)+1)  )  )  )  )  )+1)  )+1)  )+1

 2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(
 2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(1)  )+1)+1)))+1))+1)+1)+1)+1)
                                      )+1)+1)  )))  ))+1)  )+1)  )+1

по сравнению со стандартной формой, которая кратка только для базы 2 и более полезна для полиномов, чем для преобразования битовой строки/вектора:

      2^24 + 2^22 + 2^21 + 2^18 + 2^16 + 2^15 + 2^14 + 2^13 + 2^11 + 2^10 + 2^4 + 2^2

1*2^24 + 0*2^23 + 1*2^22 + 1*2^21 + 0*2^20 + 0*2^19 + 
1*2^18 + 0*2^17 + 1*2^16 + 1*2^15 + 1*2^14 + 1*2^13 + 
0*2^12 + 1*2^11 + 1*2^10 + 0*2^ 9 + 0*2^ 8 + 0*2^ 7 + 
0*2^ 6 + 0*2^ 5 + 1*2^ 4 + 0*2^ 3 + 1*2^ 2 + 0*2    + 1

  • Цифры всегда располагаются рядом друг с другом, в записи с обратным порядком байтов, при этом основание и показатель степени не мешают.

  • Это полностью исключило оператора мощности^из цепочки операций, используя вместо этого вложенные слои основы, поддерживающие друг друга.

  • Подсчитайте количество2*s (т.е.(1 << 1)), чтобы получить словоlog2(x)

    Аналогичным образом подсчитайте количество10*s (т.е.((1 << 3) + (1 << 1)) в десятичной версии, чтобы получить минимальное значениеlog10(x)

  • Для каждого из1бит, степень 2-й степени, связанной с ним, будет равна просто числу закрывающей скобки.)справа


Десятичный эквивалент этой структуры показан ниже. Во всяком случае, сжатая форма обозначений без пробелов повышает читаемость за счет близкого расположения цифр друг к другу.

      10*(10*(10*(10*(10*(10*(10*( 
  
  2)+ 3)+ 4)+ 5)+ 6)+ 7)+ 8)+ 9

10*(10*(10*(10*(10*(10*(10*(2)+3)+4)+5)+6)+7)+8)+9

Но вместо использования минимум 7 копий10и 8 цифр коэффициентов для всего 15 чисел, стандартная форма требует 21 числа для включения лишних показателей степени, которые можно легко получить, просто подсчитав слои во вложенной форме.

      2*10^7 + 3*10^6 + 4*10^5 + 5*10^4 + 
         6*10^3 + 7*10^2 + 8*10   + 9

2*10^7 + 3*10^6 + 4*10^5 + 5*10^4 + 6*10^3 + 7*10^2 + 8*10 + 9

Беспорядок в его беспросветной форме…

      2*10^7+3*10^6+4*10^5+5*10^4+6*10^3+7*10^2+8*10+9

Как только вы увидите числа в любой системе счисления в этой вложенной форме вместо стандартной записи, тогда преобразование системы счисления станет тривиальным упражнением, состоящим не более чем из удаления вложенных слоев.

В соответствии с этим: мы можем написать эту функцию справки:

          public static int convertBinaryToDecimal(String str) {
        int result = 0;
        for (int i = 0; i < str.length(); i++) {
            int value = Character.getNumericValue(str.charAt(i));
            result = result * 2 + value;
        }
        return result;
    }

Проверить это, вы обнаружите, что в коде есть строка, которая содержит Scan.S (). Это используется только для хранения данных (String). Так что просто попробуйте это:

PS: не забудьте сохранить файл как bindec

import java.io.*;
class Scan
{        
    public static String S() 
    {
        String x;
    char c;
    boolean erreur;

    do
    {
            x = "";
            erreur = false;

            try
            {
                while((c = (char)System.in.read()) != '\n')
        {
                    if (c != '\r')
                    {
                        x += c;
                    }
                }
            }
            catch(IOException e)
            {
                System.out.print(" > enter String : ");
                erreur = true;
            }
    } while(erreur);

    return x;
    }
public class  bindec{

    public static void main (String[] args) {
        int b=0;
        String a;
        System.out.println("bin: ");
        a = Lire.S();
        int j=a.length()-1;
        for(int i=0;i<a.length() ;i++ ){
            if(a.charAt(i)=='1'){
            b += Math.pow(2,j);
        }
        if(a.charAt(i)=='0'){
            b+=0;
        }
        j=j-1;
    }
        System.out.println("dec: "+b);
    }
}
public static void main(String[] args) {

    java.util.Scanner scan = new java.util.Scanner(System.in);
    long decimalValue = 0;

    System.out.println("Please enter a positive binary number.(Only 1s and 0s)");

    //This reads the input as a String and splits each symbol into 
    //array list
    String element = scan.nextLine();
    String[] array = element.split("");

    //This assigns the length to integer arrys based on actual number of 
    //symbols entered
    int[] numberSplit = new int[array.length];
    int position = array.length - 1; //set beginning position to the end of array

    //This turns String array into Integer array
    for (int i = 0; i < array.length; i++) {
        numberSplit[i] = Integer.parseInt(array[i]);
    }
    //This loop goes from last to first position of an array making
    //calculation where power of 2 is the current loop instance number
    for (int i = 0; i < array.length; i++) {
        if (numberSplit[position] == 1) {
            decimalValue = decimalValue + (long) Math.pow(2, i);
        }
        position--;
    }
    System.out.println(decimalValue);
    main(null);

}
import java.util.*;
public class BinaryToDecimal
{
  public static void main()
  {
    Scanner sc=new Scanner(System.in);
    System.out.println("enter the binary number");
    double s=sc.nextDouble();
    int c=0;
    long s1=0;
    while(s>0)
    {
        s1=s1+(long)(Math.pow(2,c)*(long)(s%10));
        s=(long)s/10;
        c++;
    }
    System.out.println("The respective decimal number is : "+s1);
  }
}

Попробуй это

import java.util.Scanner;
public class BinaryToDecimal{

public static void main(String[] args) {

    Scanner input = new Scanner(System.in);
    int binaryNumber = 0;
    int counter = 0;
    int number = 0;


    System.out.print("Input binary number: ");
    binaryNumber = input.nextInt();

    //it's going to stop when the binaryNumber/10 is less than 0
    //example:
    //binaryNumber = 11/10. The result value is 1 when you do the next
    //operation 1/10 . The result value is 0     

    while(binaryNumber != 0)
    {
        //Obtaining the remainder of the division and multiplying it 
        //with the number raised to two

        //adding it up with the previous result

        number += ((binaryNumber % 10)) * Math.pow(2,counter);

        binaryNumber /= 10;  //removing one digit from the binary number

        //Increasing counter 2^0, 2^1, 2^2, 2^3.....
        counter++;

    }
    System.out.println("Decimal number : " + number);


}

}

public static void convertStringToDecimal(String binary)
{
    int decimal=0;
    int power=0;
    while(binary.length()>0)
    {
        int temp = Integer.parseInt(binary.charAt((binary.length())-1)+"");
        decimal+=temp*Math.pow(2, power++);
        binary=binary.substring(0,binary.length()-1);
    }
    System.out.println(decimal);
}
private static int convertBinaryToDecimal(String strOfBinary){
        int flag = 1, binary=0;
        char binaryOne = '1';
        char[] charArray = strOfBinary.toCharArray();
        for(int i=charArray.length-1;i>=0;i--){
            if(charArray[i] == binaryOne){
                binary+=flag;
            }
            flag*=2;
        }
        return binary;
    }
  int base2(String bits) {
    int ans = 0;
    for (int i = bits.length() - 1, f = 1; i >= 0; i--) {
      ans += f * (bits.charAt(i) - '0');
      f <<= 1;
    }
    return ans;
  }
Другие вопросы по тегам