web-dev-qa-db-ja.com

2進数の追加

Javaでバイナリとして入力された2つのバイナリ番号を追加する方法を知っている人はいますか?

例えば、 1010 + 10 = 1100

16
PulsePanda

Integer.parseInt(String, int radix) を使用します。

 public static String addBinary(){
 // 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;
    return Integer.toBinaryString(sum); //returns the answer as a binary value;
}
42

基本に飛び込むには:

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);
}
20
sbaker

Martijnは、ピギーバックして答えを完了するために、絶対に正しいです

Integer.toBinaryString(sum);

oPの質問に従ってバイナリで出力を提供します。

12
non sequitor

2進数であることを指定するには、2進数の前に0bを置くだけです。

この例では、次のことが簡単にできます。

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

これにより、2つのバイナリが追加され、2番目のパラメータとして2が指定されたInteger.toString()がバイナリに変換されます。

6
haley

Martijnによる元のソリューションは、大きな2進数では機能しません。以下のコードを使用して、それを克服できます。

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();
}
3
akuriako

別の興味深いが長いアプローチは、2つの数値をそれぞれ10進数に変換し、10進数を追加して、得られた回答を2進数に変換することです!

1
programmer_360

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

}
1
Shubham
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
james
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);


    }

}
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]);
    }
}
0
Arpan Dasgupta

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]
0
Algorithmatic
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
monir

簡単な方法の1つは次のとおりです。

  1. 2つの文字列をchar []配列に変換し、carry = 0に設定します。
  2. forループの最小配列長を設定します
  3. 最後のインデックスからforループを開始し、デクリメントします
  4. 両方の配列の各要素のバイナリ加算について4つの条件(0 + 0 = 0、0 + 1 = 1、1 + 0 = 1、1 + 1 = 10(carry = 1))を確認し、それに応じてキャリーをリセットします。
  5. stringbufferに追加を追加します
  6. 最大サイズの配列から文字列バッファに残りの要素を追加しますが、追加中にキャリーを考慮してください
  7. 答えの逆順で文字列バッファを出力します。

// 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
Nik's

独自のOneを書くことができます。

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
e.hadid
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
Subrat Sahu

私はそれを簡単にしようとしましたが、これは暗号化に対処しなければならなかったため、効率的ではありませんが、私はそれを願っています

    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
user3514540
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
user3621079

このアイデアは、いくつかの回答で説明したものと同じですが、これははるかに短く、理解しやすいソリューションです(手順はコメント付きです)。

// Handles numbers which are way bigger.
public String addBinary(String a, String b) {
    StringBuilder sb = new StringBuilder();
    int i = a.length() - 1; 
    int j = b.length() -1;
    int carry = 0;
    while (i >= 0 || j >= 0) {
        int sum = carry;
        if (j >= 0) { sum += b.charAt(j--) - '0' };
        if (i >= 0) { sum += a.charAt(i--) - '0' };

        // Added number can be only 0 or 1
        sb.append(sum % 2);

        // Get the carry.
        carry = sum / 2;
    }

    if (carry != 0) { sb.append(carry); }

    // First reverse and then return.
    return sb.reverse().toString();
}
0
Pritam Banerjee