Как преобразовать двоичное значение строки в десятичное
Как преобразовать двоичную строку, такую как
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)
Нужно думать о десятичной точности, поэтому вы должны ограничить длину цепочки битов. В любом случае, использование 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
Как только вы увидите числа в любой системе счисления в этой вложенной форме вместо стандартной записи, тогда преобразование системы счисления станет тривиальным упражнением, состоящим не более чем из удаления вложенных слоев.
Проверить это, вы обнаружите, что в коде есть строка, которая содержит 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;
}