Добавление двоичных чисел - PullRequest
15 голосов
/ 18 декабря 2011

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

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

Ответы [ 18 ]

0 голосов
/ 03 ноября 2017

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

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

он работает только по числам, без необходимости строки, без необходимости SubString и ...

0 голосов
/ 17 мая 2017

Один из простых способов заключается в следующем:

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

// Ява-код имеет вид

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 голосов
/ 30 мая 2013
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 голосов
/ 14 июля 2016
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 голосов
/ 12 июня 2016
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 голосов
/ 20 мая 2014

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

    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;
      }
0 голосов
/ 16 октября 2015

Мне действительно удалось найти решение этого вопроса без использования функции 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]);
    }
}
0 голосов
/ 16 ноября 2014

вот версия Python,

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]
...