2011-12-17 3 views
10

Кто-нибудь знает, как добавить 2 двоичных числа, введенных как двоичные, в Java?Добавление двоичных чисел

Например, 1010 + 10 = 1100.

+0

@twiddles Нет больше домашних заданий мечения! :) – squiguy

+0

Это может взорвать ваш разум. Вы можете написать код C в java. C является более низким уровнем, и вы можете выполнять с ним двоичную арифметику. Уже поздно, поэтому я не пишу образец, но вы можете посмотреть его. – user817129

ответ

29

Да, я знаю как.

Использование Integer.parseInt(String, int radix).

// The two input Strings, containing the binary representation of the two values: 
String input0 = "1010"; 
String input1 = "10"; 

// Use as radix 2 because it's binary  
int number0 = Integer.parseInt(input0, 2); 
int number1 = Integer.parseInt(input1, 2); 

int sum = number0 + number1; 
+0

wow. это сработало! Спасибо брат. но мне было интересно, можете ли вы объяснить, почему? – PulsePanda

+0

'Integer' - это класс, который содержит метод для синтаксического анализа строки, представляющей целое число с его реальным целым значением (' int'). Вы можете взглянуть на ссылку, которую я вам предоставил. –

+0

Мартин - он не отображает ответ в двоичном формате. Как мы это делаем? –

12

Мартейн является абсолютно правильным, контрейлерных и завершить ответ

Integer.toBinaryString(sum); 

дал бы свой вывод в двоичный файл в соответствии с OP вопрос.

0
public class BinaryArithmetic { 

    /*-------------------------- add ------------------------------------------------------------*/ 
    static String add(double a, double b) { 
     System.out.println(a + "first val :" + b); 
     int a1 = (int) a; 
     int b1 = (int) b; 
     String s1 = Integer.toString(a1); 
     String s2 = Integer.toString(b1); 
     int number0 = Integer.parseInt(s1, 2); 
     int number1 = Integer.parseInt(s2, 2); 

     int sum = number0 + number1; 
     String s3 = Integer.toBinaryString(sum); 

     return s3; 
    } 
    /*-------------------------------multiply-------------------------------------------------------*/ 

    static String multiply(double a, double b) { 
     System.out.println(a + "first val :" + b); 
     int a1 = (int) a; 
     int b1 = (int) b; 
     String s1 = Integer.toString(a1); 
     String s2 = Integer.toString(b1); 
     int number0 = Integer.parseInt(s1, 2); 
     int number1 = Integer.parseInt(s2, 2); 

     int sum = number0 * number1; 
     String s3 = Integer.toBinaryString(sum); 

     return s3; 
    } 
    /*----------------------------------------substraction----------------------------------------------*/ 

    static String sub(double a, double b) { 
     System.out.println(a + "first val :" + b); 
     int a1 = (int) a; 
     int b1 = (int) b; 
     String s1 = Integer.toString(a1); 
     String s2 = Integer.toString(b1); 
     int number0 = Integer.parseInt(s1, 2); 
     int number1 = Integer.parseInt(s2, 2); 

     int sum = number0 - number1; 
     String s3 = Integer.toBinaryString(sum); 

     return s3; 
    } 

    /*--------------------------------------division------------------------------------------------*/ 
    static String div(double a, double b) { 
     System.out.println(a + "first val :" + b); 
     int a1 = (int) a; 
     int b1 = (int) b; 
     String s1 = Integer.toString(a1); 
     String s2 = Integer.toString(b1); 
     int number0 = Integer.parseInt(s1, 2); 
     int number1 = Integer.parseInt(s2, 2); 

     int sum = number0/number1; 
     String s3 = Integer.toBinaryString(sum); 

     return s3; 
    } 
} 
0

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

17

Нырять в основы:

public static String binaryAddition(String s1, String s2) { 
    if (s1 == null || s2 == null) return ""; 
    int first = s1.length() - 1; 
    int second = s2.length() - 1; 
    StringBuilder sb = new StringBuilder(); 
    int carry = 0; 
    while (first >= 0 || second >= 0) { 
     int sum = carry; 
     if (first >= 0) { 
      sum += s1.charAt(first) - '0'; 
      first--; 
     } 
     if (second >= 0) { 
      sum += s2.charAt(second) - '0'; 
      second--; 
     } 
     carry = sum >> 1; 
     sum = sum & 1; 
     sb.append(sum == 0 ? '0' : '1'); 
    } 
    if (carry > 0) 
     sb.append('1'); 

    sb.reverse(); 
    return String.valueOf(sb); 
} 
+0

@Serhanbaker Не могли бы вы объяснить, sum + = s1.charAt (first) - '0'; немного. Спасибо – kaila88

0

я попытался сделать это просто это было н я имел дело с моей криптографией Prj его не эффективной, но я надеюсь, что это

public String binarysum(String a, String b){ 
    int carry=0; 
    int maxim; 
    int minim; 
    maxim=Math.max(a.length(),b.length()); 
    minim=Math.min(a.length(),b.length());   
    char smin[]=new char[minim]; 
    char smax[]=new char[maxim]; 
    if(a.length()==minim){ 
    for(int i=0;i<smin.length;i++){ 
    smin[i]=a.charAt(i); 
     } 
     for(int i=0;i<smax.length;i++){ 
     smax[i]=b.charAt(i); 
     } 
     } 
     else{ 
      for(int i=0;i<smin.length;i++){ 
      smin[i]=b.charAt(i); 
      } 
     for(int i=0;i<smax.length;i++){ 
     smax[i]=a.charAt(i); 
     } 
     } 
    char[]sum=new char[maxim]; 
    char[] st=new char[maxim]; 
    for(int i=0;i<st.length;i++){ 
    st[i]='0'; 
    } 
    int k=st.length-1; 
    for(int i=smin.length-1;i>-1;i--){ 
    st[k]=smin[i]; 
    k--; 
    } 

    // *************************** sum begins here 
    for(int i=maxim-1;i>-1;i--){ 
    char x= smax[i]; 
    char y= st[i]; 
    if(x==y && x=='0'){ 
     if(carry==0) 
      sum[i]='0'; 
     else if(carry==1){ 
      sum[i]='1'; 
      carry=0; 
    } 
    } 
    else if(x==y && x=='1'){ 
     if(carry==0){ 
      sum[i]='0'; 
      carry=1; 
     } 
     else if(carry==1){ 
      sum[i]='1'; 
      carry=1; 
     } 
    } 
    else if(x!=y){ 
     if(carry==0){ 
      sum[i]='1'; 
      } 
     else if(carry==1){ 
      sum[i]='0'; 
      carry=1; 
     } 
     }  } 
     String s=new String(sum); 
    return s; 
     } 
6

Вы можете просто поставьте 0b перед двоичным номером, чтобы указать, что он двоичный.

Для этого примера, вы можете просто сделать:

Integer.toString(0b1010 + 0b10, 2); 

Это добавит два в двоичной, и Integer.toString() с 2, как второй параметр преобразует его обратно в двоичный формат.

+0

Бинарные литералы разрешены также в java 7, см. Https://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.1 – fabian

+0

Это должен быть правильный ответ ; нет причин конвертировать в строки или катить собственное решение. – Jason

0

вот версия питона что

def binAdd(s1, s2): 
    if not s1 or not s2: 
     return '' 

    maxlen = max(len(s1), len(s2)) 


    s1 = s1.zfill(maxlen) 
    s2 = s2.zfill(maxlen) 

    result = '' 
    carry = 0 

    i = maxlen - 1 
    while(i >= 0): 
     s = int(s1[i]) + int(s2[i]) 
     if s == 2: #1+1 
      if carry == 0: 
       carry = 1 
       result = "%s%s" % (result, '0') 
      else: 
       result = "%s%s" % (result, '1') 
     elif s == 1: # 1+0 
      if carry == 1: 
       result = "%s%s" % (result, '0') 
      else: 
       result = "%s%s" % (result, '1') 
     else: # 0+0 
      if carry == 1: 
       result = "%s%s" % (result, '1') 
       carry = 0 
      else: 
       result = "%s%s" % (result, '0') 

     i = i - 1; 

    if carry>0: 
     result = "%s%s" % (result, '1') 
    return result[::-1] 
+5

Вопрос конкретно говорит 'Java'. –

0

Я на самом деле удалось найти решение этого вопроса без использования функции stringbuilder(). Проверьте это:

public void BinaryAddition(String s1,String s2) 
{ 
    int l1=s1.length();int c1=l1; 
    int l2=s2.length();int c2=l2; 
    int max=(int)Math.max(l1,l2); 
    int arr1[]=new int[max]; 
    int arr2[]=new int[max]; 
    int sum[]=new int[max+1]; 
    for(int i=(arr1.length-1);i>=(max-l1);i--) 
    { 
     arr1[i]=(int)(s1.charAt(c1-1)-48); 
     c1--; 
    } 
    for(int i=(arr2.length-1);i>=(max-l2);i--) 
    { 
     arr2[i]=(int)(s2.charAt(c2-1)-48); 
     c2--; 
    } 
    for(int i=(sum.length-1);i>=1;i--) 
    { 
     sum[i]+=arr1[i-1]+arr2[i-1]; 
     if(sum[i]==2) 
     { 
      sum[i]=0; 
      sum[i-1]=1; 
     } 
     else if(sum[i]==3) 
     { 
      sum[i]=1; 
      sum[i-1]=1; 
     } 
    } 
    int c=0; 
    for(int i=0;i<sum.length;i++) 
    { 
     System.out.print(sum[i]); 
    } 
} 
1

Java решение

static String addBinary(String a, String b) { 

    int lenA = a.length(); 
    int lenB = b.length(); 
    int i = 0; 

    StringBuilder sb = new StringBuilder(); 
    int rem = Math.abs(lenA-lenB); 
    while(rem >0){ 
     sb.append('0'); 
     rem--; 
    } 
    if(lenA > lenB){ 
     sb.append(b); 
     b = sb.toString(); 
    }else{ 
     sb.append(a); 
     a = sb.toString(); 
    } 

    sb = new StringBuilder(); 
    char carry = '0'; 
    i = a.length(); 
    while(i > 0){ 
     if(a.charAt(i-1) == b.charAt(i-1)){ 
      sb.append(carry); 
      if(a.charAt(i-1) == '1'){ 
       carry = '1'; 
      }else{ 
       carry = '0'; 
      } 
     }else{ 
      if(carry == '1'){ 
       sb.append('0'); 
       carry = '1'; 
      }else{ 
       carry = '0'; 
       sb.append('1'); 
      } 
     } 
     i--; 
    } 

    if(carry == '1'){ 
     sb.append(carry); 
    } 

    sb.reverse(); 
    return sb.toString(); 

} 
0
class Sum{ 
    public int number; 
    public int carry; 

    Sum(int number, int carry){ 
     this.number = number; 
     this.carry = carry; 
    } 
} 

public String addBinary(String a, String b) { 

    int lengthOfA = a.length(); 
    int lengthOfB = b.length(); 

    if(lengthOfA > lengthOfB){ 
     for(int i=0; i<(lengthOfA - lengthOfB); i++){ 
      b="0"+b; 
     } 
    } 
    else{ 
     for(int i=0; i<(lengthOfB - lengthOfA); i++){ 
      a="0"+a; 
     } 
    } 

    String result = ""; 
    Sum s = new Sum(0,0); 
    for(int i=a.length()-1; i>=0; i--){ 
     s = addNumber(Character.getNumericValue(a.charAt(i)), Character.getNumericValue(b.charAt(i)), s.carry); 
     result = result + Integer.toString(s.number); 
    } 

    if(s.carry == 1) { result += s.carry ;} 

    return new StringBuilder(result).reverse().toString(); 
} 

Sum addNumber(int number1, int number2, int carry){ 
     Sum sum = new Sum(0,0); 
     sum.number = number1^number2^carry; 
     sum.carry = (number1 & number2) | (number2 & carry) | (number1 & carry); 

     return sum; 
} 
0
import java.util.*; 
public class BitAddition { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     Scanner sc = new Scanner(System.in); 
     int len = sc.nextInt(); 
     int[] arr1 = new int[len]; 
     int[] arr2 = new int[len]; 
     int[] sum = new int[len+1]; 
     Arrays.fill(sum, 0); 
     for(int i=0;i<len;i++){ 
      arr1[i] =sc.nextInt(); 
     } 
     for(int i=0;i<len;i++){ 
      arr2[i] =sc.nextInt(); 
     } 
     for(int i=len-1;i>=0;i--){ 
      if(sum[i+1] == 0){ 
       if(arr1[i]!=arr2[i]){ 
        sum[i+1] = 1; 
       } 
       else if(arr1[i] ==1 && arr2[i] == 1){ 
        sum[i+1] =0 ; 
        sum[i] = 1; 
       } 
      } 
      else{ 
       if((arr1[i]!=arr2[i])){ 
        sum[i+1] = 0; 
        sum[i] = 1; 
       } 
       else if(arr1[i] == 1){ 
        sum[i+1] = 1; 
        sum[i] = 1; 
       } 
      } 
     } 
     for(int i=0;i<=len;i++){ 

     System.out.print(sum[i]); 
     } 
    } 

} 
0

Один из простых способов как:

  1. преобразовать две строки на символ [] массив и set carry = 0.
  2. установить наименьшую длину массива в течение цикла
  3. старт для цикла от последнего индекса и уменьшить его
  4. проверки 4 условия (0 + 0 = 0, 0 + 1 = 1, 1 + 0 = 1, 1 + 1 = 10 (carry = 1)) для двоичного сложения для каждого элемента в обоих массивах и соответственно сбросить перенос.
  5. добавить Сложение в StringBuffer
  6. на добавление остальных элементов из массива максимального размера для StringBuffer, но проверить считает носить в то время как добавление
  7. печать StringBuffer в обратном порядке для ответа.

// код Java как

static String binaryAdd(String a, String b){ 
    int len = 0; 
    int size = 0; 
    char[] c1 = a.toCharArray(); 
    char[] c2 = b.toCharArray(); 
    char[] max; 


    if(c1.length > c2.length){ 
     len = c2.length; 
     size = c1.length; 
     max = c1; 
    }  
    else 
    { 
     len = c1.length; 
     size = c2.length; 
     max = c2; 
    } 

    StringBuilder sb = new StringBuilder(); 
    int carry = 0; 
    int p = c1.length - 1; 
    int q = c2.length - 1; 

    for(int i=len-1; i>=0; i--){ 
     if(c1[p] == '0' && c2[q] == '0'){ 
      if(carry == 0){ 
       sb.append(0); 
       carry = 0; 
      } 
      else{ 
       sb.append(1); 
       carry = 0; 
      } 
     } 
     if((c1[p] == '0' && c2[q] == '1') || (c1[p] == '1' && c2[q] == '0')){ 
      if(carry == 0){ 
       sb.append(1); 
       carry = 0; 
      } 
      else{ 
       sb.append(0); 
       carry = 1; 
      }     
     } 
     if((c1[p] == '1' && c2[q] == '1')){ 
      if(carry == 0){ 
       sb.append(0); 
       carry = 1; 
      } 
      else{ 
       sb.append(1); 
       carry = 1; 
      } 
     } 
     p--; 
     q--; 
    } 

    for(int j = size-len-1; j>=0; j--){ 
     if(max[j] == '0'){ 
      if(carry == 0){  
       sb.append(0); 
       carry = 0; 
      } 
      else{ 
       sb.append(1); 
       carry = 0; 
      } 
     } 
     if(max[j] == '1'){ 
      if(carry == 0){  
       sb.append(1); 
       carry = 0; 
      } 
      else{ 
       sb.append(0); 
       carry = 1; 
      } 
     }   
    } 
    if(carry == 1) 
     sb.append(1); 
    return sb.reverse().toString(); 
} 
0

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

public String addBinary(String s1, String s2) { 
    StringBuilder sb = new StringBuilder(); 
    int i = s1.length() - 1, j = s2.length() -1, carry = 0; 
    while (i >= 0 || j >= 0) { 
     int sum = carry; 
     if (j >= 0) sum += s2.charAt(j--) - '0'; 
     if (i >= 0) sum += s1.charAt(i--) - '0'; 
     sb.append(sum % 2); 
     carry = sum/2; 
    } 
    if (carry != 0) sb.append(carry); 
    return sb.reverse().toString(); 
} 
0
import java.io.; 
import java.util.; 
public class adtbin { 
    static Scanner sc=new Scanner(System.in); 
    public void fun(int n1) { 
     int i=0; 
     int sum[]=new int[20]; 
     while(n1>0) { 
     sum[i]=n1%2; n1=n1/2; i++; 
     } 
     for(int a=i-1;a>=0;a--) { 
      System.out.print(sum[a]); 
     } 
    } 
    public static void main() { 
    int m,n,add; 
    adtbin ob=new adtbin(); 
    System.out.println("enter the value of m and n"); 
    m=sc.nextInt(); 
    n=sc.nextInt(); 
    add=m+n; 
    ob.fun(add); 
    } 
} 
+0

Немного объяснения приветствуется с кодом. ответы на код могут быть отмечены как «низкое качество» и удалены, даже если они являются технически обоснованными. –

0

Вы можете написать свой собственный.

long a =100011111111L; 
long b =1000001111L; 

int carry = 0 ; 
long result = 0; 

long multiplicity = 1; 

while(a!=0 || b!=0 || carry ==1){ 
    if(a%10==1){ 
     if(b%10==1){ 
      result+= (carry*multiplicity); 
      carry = 1; 
     }else if(carry == 1){ 
      carry = 1; 
     }else{ 
      result += multiplicity; 
     } 
    }else if (b%10 == 1){ 
     if(carry == 1){ 
      carry = 1; 
     }else { 
      result += multiplicity; 
     } 
    }else { 
     result += (carry*multiplicity); 
     carry = 0; 
    } 

    a/=10; 
    b/=10; 
    multiplicity *= 10; 

} 


System.out.print(result); 

он работает только по номерам, не нужна строки, нет необходимости подстроки и ...

0
package Assignment19thDec; 

import java.util.Scanner; 

public class addTwoBinaryNumbers { 

    private static Scanner sc; 

    public static void main(String[] args) { 

     sc = new Scanner(System.in); 
     System.out.println("Enter 1st Binary Number"); 
     int number1=sc.nextInt(); 
     int reminder1=0; 
     int number2=sc.nextInt(); 
     int reminder2=0; 
     int carry=0; 
     double sumResult=0 ;int add = 0 
     ; 
     int n; 
     int power=0; 
     while (number1>0 || number2>0) { 

      /*System.out.println(number1 + " " +number2);*/ 

      reminder1=number1%10; 
      number1=number1/10; 
      reminder2=number2%10; 
      number2=number2/10; 
      /*System.out.println(reminder1 +" "+ reminder2);*/ 


      if(reminder1>1 || reminder2>1) { 
       System.out.println("not a binary number"); 
       System.exit(0); 
      } 

      n=reminder1+reminder2+carry; 
      switch(n) { 

      case 0: 
        add=0; carry=0;         
        break;     
      case 1: add=1; carry=0; 
        break; 
      case 2: add=0; carry=1; 
        break; 
      case 3: add=1;carry=1; 
        break; 
      default: System.out.println("not a binary number "); 

      } 

      sumResult=add*(Math.pow(10, power))+sumResult; 
      power++; 


     } 

     sumResult=carry*(Math.pow(10, power))+sumResult; 
     System.out.println("\n"+(int)sumResult); 


    } 

} 
+1

Я думаю, что небольшое объяснение поможет – Valerica

Смежные вопросы