10

C ++で2つの2進数を追加するにはどうすればよいですか?正しいロジックは何ですか?

これが私の努力ですが、正しくないようです:

#include <iostream>
using namespace std;
int main()
{
    int a[3];
    int b[3];
    int carry = 0;
    int result[7];

    a[0] = 1;
    a[1] = 0;
    a[2] = 0;
    a[3] = 1;

    b[0] = 1;
    b[1] = 1;
    b[2] = 1;
    b[3] = 1;

    for(int i = 0; i <= 3; i++)
    {
        if(a[i] + b[i] + carry == 0)
        {
            result[i] = 0;
            carry = 0;
        }

        if(a[i] + b[i] + carry == 1)
        {
            result[i] = 0;
            carry = 0;
        }

        if(a[i] + b[i] + carry == 2)
        {
            result[i] = 0;
            carry = 1;
        }

        if(a[i] + b[i] + carry > 2)
        {
            result[i] = 1;
            carry = 1;
        }
    }
    for(int j = 0; j <= 7; j++)
    {
        cout<<result[j]<<" ";
    }
    system("pause");
}
4

13 に答える 13

30

まあ、それはかなり些細な問題です。

C++ で 2 つの 2 進数を加算する方法。それの論理は何ですか。

2 つの 2 進数 a と b を加算します。これを行うには、次の式を使用できます。

合計 = a xor b

キャリー=アブ

これは半加算器の方程式です。

これを実装するには、全加算器がどのように機能するかを理解する必要があるかもしれません。

合計 = a xor b xor c

キャリー= ab + bc + ca

2 進数を int 配列に格納するため、ビット単位の操作を理解したい場合があります。XOR には ^ を使用できます。| OR の場合は演算子、AND の場合は & 演算子。

合計を計算するサンプル コードを次に示します。

for(i = 0; i < 8 ; i++){
   sum[i] = ((a[i] ^ b[i]) ^ c); // c is carry
   c = ((a[i] & b[i]) | (a[i] & c)) | (b[i] & c); 
}
于 2012-11-08T05:38:47.407 に答える
7

あなたはC++について質問していたので、C++の答えに値します。ビットセットを使用する:

#include <bitset>
#include <iostream>

int main() {
  std::bitset<5> const a("1001");
  std::bitset<5> const b("1111");
  // m here is a mask to extract the lsb of a bitset.
  std::bitset<5> const m("1");
  std::bitset<5> result;
  for (auto i = 0; i < result.size(); ++i) {
    std::bitset<5> const diff(((a >> i)&m).to_ullong() + ((b >> i)&m).to_ullong() + (result >> i).to_ullong());
    result ^= (diff ^ (result >> i)) << i;
  }
  std::cout << result << std::endl;
}

これは、任意の長さのビットセットに対して機能します。

于 2012-11-08T06:08:33.703 に答える
2

バグがあります:

if(a[i]+b[i]+carry==1)  
{   
result[i]=1; 
carry=0;  
}  

また、逆に印刷することもできます

for(int j=6; j>=0; j--)  
{  
   cout<<result[j]<<" ";  
}
于 2012-11-08T05:15:17.517 に答える
2

「ビット単位の OR」演算を使用してコードを削減できます。

1 or 1 = 1
1 or 0 = 1
0 or 1 = 1
0 or 0 = 0

両方の数値を 10 進数の合計に変換して、再び 2 進数に戻すこともできます。

10 進数から 2 進数への変換

int toBinary (unsigned int num, char b[32])
    {
    unsigned  int x = INT_MIN;      // (32bits)
    int i = 0, count = 0;
    while (x != 0)
    {
      if(x & num) // If the actual o bit is 1 & 1 = 1 otherwise = 0
      {
          b[i] = '1';
          count++;
      }
      else b[i] = '0';

      x >>=1;       // pass to the left
      i++;          
    }
    return count;
    }
于 2012-11-08T05:35:57.853 に答える
1

以下はコード内のエラーであり、修正されたコードも以下にあります」

  1. int a[] はサイズが 3 だったので、3 番目のインデックスに格納できません。int a[4] を使用します。
  2. if(a[i]+b[i]+carry==1) このチェックで間違った値が割り当てられた場合、結果[i]=1を更新します。キャリー=0。
  3. チェックの順序が逆になります。
  4. 最後のキャリーは結果に格納されませんでした。
  5. 結果配列に格納された加算結果は逆順だったので、逆に出力しました。

ここにコードの作業部分があります:

#include <iostream>
#include <string>
using namespace std;

int main()
{
    int a[4];
    int b[4];
    int carry=0;
    int result[5];


    a[0]=1;
    a[1]=0;
    a[2]=0;
    a[3]=1;

    b[0]=1;
    b[1]=1;
    b[2]=1;
    b[3]=1;

    for(int i=0; i<4; i++)
    {

        if(a[i]+b[i]+carry==3)
        {
        result[i]=1;
        carry=1;
        }
        if(a[i]+b[i]+carry==2)
        {
        result[i]=0;
        carry=1;
        }
        if(a[i]+b[i]+carry==1)
        {
        result[i]=1;
        carry=0;
        }
        if(a[i]+b[i]+carry==0)
        {
        result[i]=0;
        carry=0;
        }


    }
    result[4]=carry;
    for(int j=4; j>=0; j--)
    {
        cout<<result[j];

    }
    cout<<endl;

        return 0;
}
于 2012-11-08T07:12:10.703 に答える
1
#include <stdio.h>



int main()

{



    long binary1, binary2;

    int i = 0, remainder = 0, sum[20];



    printf("Enter the first binary number: ");

    scanf("%ld", &binary1);

    printf("Enter the second binary number: ");

    scanf("%ld", &binary2);

    while (binary1 != 0 || binary2 != 0)

    {

        sum[i++] =(binary1 % 10 + binary2 % 10 + remainder) % 2;

        remainder =(binary1 % 10 + binary2 % 10 + remainder) / 2;

        binary1 = binary1 / 10;

        binary2 = binary2 / 10;

    }

    if (remainder != 0)

        sum[i++] = remainder;

    --i;

    printf("Sum of two binary numbers: ");

    while (i >= 0)

        printf("%d", sum[i--]);

    getch();
    return 0;

}
于 2013-10-21T19:51:45.427 に答える
1

配列は、索引付けするには小さすぎる 1 つの項目です。

int a[3]は 3 つの要素しかないため、存在しない 4 番目の要素にアクセスしているためa[3] = 1、無効です (未定義の動作があります)。
他のアレイについても同様です。

これは、プログラム全体が未定義の動作をすることを意味します。つまり、何でもできるか、まったく何もできないということです。

(あなたのケースでおそらく起こっているのは、配列の外側に書き込むと、他の変数が上書きされることです。)

また、配列を初期化していないresultため、その内容は単なるランダム データです。
その要素のうち 4 つだけを更新し、それらすべて (およびそれ以上) を出力するため、出力もランダム データになります。

于 2012-11-08T06:45:18.190 に答える
0

繰り返し行う

(x, y) <- ((x & y) << 1, x ^ y)

xが0になるまで。yが答えです。

于 2012-11-08T05:53:32.317 に答える
0

それらのサイズが同じでない場合はどうなりますか? また、ユーザーが 2 進数 (この場合は整数を表す) を配列の要素としてではなく整数として入力できるようにする必要があります。これらを実現するコードは次のとおりです:-)

#include <iostream>
using namespace std; 

// Add two numbers in binary

void sumBinary(int num1, int num2, int* sum12){
    int mod1 = 0;
    int mod2 = 0;
    int carry = 0;
    int factor = 1;

    int flag = 0;

    *sum12 = 0;

    while (!flag){
        mod1 = num1 % 10;
        mod2 = num2 % 10;

        num1 /= 10;
        num2 /= 10;
        if ((carry + mod1 + mod2) == 2){
            *sum12 += 0;
            carry = 1;
        }
        else if ((carry + mod1 + mod2) == 3){
            *sum12 += factor;
            carry = 1;
        }
        else if ((carry + mod1 + mod2) == 0){
            *sum12 += 0;
            carry = 0;
        }
        else{
            *sum12 += factor;
            carry = 0;
        }
        factor *= 10;
        if ((num1 == 0) && (num2 == 0)){ 
            *sum12 += carry*factor;
            flag = 1; }


    }
}
void main(){
    int num1, num2, sum12;

    cout << "Enter the first binary integer number: ";
    cin >> num1;
    cout << "Enter the second binary integer number: ";
    cin >> num2;

    sumBinary(num1, num2, &sum12);

    cout << "The sum in binary form is :" << sum12 << endl;
}
于 2016-05-22T10:18:12.443 に答える
0

従来とは異なるソリューションですが、機能します。

int main() {

  int A[] = { 0, 0, 0, 1, 1, 0, 1, 0};
  int B[] = { 0, 0, 0, 0, 1, 1, 0, 0};

  int size = sizeof(A)/sizeof(*A);

  int C[size+1];
  int t = 0;

  for(int i = size-1; i > -1; i--){

      C[i+1] = A[i]+B[i]+t;
      t = C[i+1]/2;
      C[i+1] %= 2;
  }

  C[0] = t;
}
于 2015-12-06T23:04:22.713 に答える
0

あなたはこれをするべきです

for(int i = 3; i >= 0; i--)
    {
        if(a[i] + b[i] + carry == 0)
        {
            result[i] = 0;
            carry = 0;
        }
        else if(a[i]+b[i]+carry==1)
        {
            result[i]=1;
            carry=0;  
        }
        else if(a[i] + b[i] + carry == 2)
        {
            result[i] = 0;
            carry = 1;
        }
        else if(a[i] + b[i] + carry > 2)
        {
            result[i] = 1;
            carry = 1;
        }
        printf("%d",result[i]);
    }
于 2015-09-21T07:45:20.730 に答える