0

私は2進数を一緒に乗算/除算/加算/減算できるようにするプログラムに取り組んでいます。私のプログラムでは、すべての整数を数字のベクトルとして表すようにしています。

足し算でこれを行う方法をなんとか理解できましたが、掛け算でつまずき、このプログラムのガイドとして擬似コードを取得する方法について誰かがアドバイスをくれるかどうか疑問に思いました。

前もって感謝します!

編集:私はまだ物事をクリアするために乗算のアルゴリズムを作成する方法を理解しようとしています。このアルゴリズムを理解する方法についての助けをいただければ幸いです。私は通常C++で作業しないので、C++で物事を理解するのに少し時間がかかります。

4

5 に答える 5

3

乗算したい場合は、ブースのアルゴリズムを検討することもできます。 ブースの乗算アルゴリズム

于 2012-09-09T18:46:02.623 に答える
2

擬似コードでの長い乗算は次のようになります。

vector<digit> x;
vector<digit> y;

total = 0;
multiplier = 1;
for i = x->last -> x->first   //start off with the least significant digit of x
   total = total + i * y * multiplier
   multiplier *= 10;

return total
于 2012-09-09T18:41:42.537 に答える
0

バイナリ乗算器またはCPUで使用されるその他の回路をシミュレートしてみることができます。

于 2012-09-09T18:40:37.053 に答える
0

何かを試してみましたが、これは、符号なしの値を2進数で乗算するだけで機能します。

unsigned int multiply(unsigned int left, unsigned int right)
{
    unsigned long long result = 0; //64 bit result

    unsigned int R = right; //32 bit right input
    unsigned int M = left; //32 bit left input

    while (R > 0)
    {
        if (R & 1)
        {// if Least significant bit exists
            result += M; //add by shifted left
        }
        R >>= 1;
        M <<= 1; //next bit
    }

/*-- if you want to check for multiplication overflow: --
    if ((result >> 32) != 0)
    {//if has more than 32 bits
        return -1; //multiplication overflow
    }*/

    return (unsigned int)result;
}

しかし、それはそれのバイナリレベルです...私はあなたが入力として数字のベクトルを持っているだけです

于 2012-09-09T19:10:41.953 に答える
0

私は、Webで見つけたバイナリ加算関数を、加算するために送信する前に最初に数値を「シフト」するコードと組み合わせて使用​​するこのアルゴリズムを作成しました。このビデオにあるロジックで動作しますhttps://www.youtube.com/watch?v=umqLvHYeGiI

これがコードです:

#include <iostream>
#include <string>

using namespace std;

// This function adds two binary strings and return 
// result as a third string 
string addBinary(string a, string b)
{
    string result = ""; // Initialize result 
    int s = 0;          // Initialize digit sum 
    int flag =0;
    // Traverse both strings starting from last 
    // characters 
    int i = a.size() - 1, j = b.size() - 1;
    
    while (i >= 0 || j >= 0 || s == 1)
    {

        // Computing the sum of the digits from right to left
          //x = (condition) ? (value_if_true) : (value_if_false);
          //add the fire bit of each string to digit sum 
        s += ((i >= 0) ? a[i] - '0' : 0);
        s += ((j >= 0) ? b[j] - '0' : 0);


        // If current digit sum is 1 or 3, add 1 to result 
        //Other wise it will be written as a zero 2%2 + 0 = 0
            //and it will be added to the heading of the string (to the left)
        result = char(s % 2 + '0') + result;

        // Compute carry
        //Not using double so we get either 1 or 0 as a result
        s /= 2;

        // Move to next digits (more to the left)
        i--; j--;
    }
    return result;
}

int main()
{

    string a, b, result= "0"; //Multiplier, multiplicand, and result
    string temp="0";  //Our buffer
    int shifter = 0;  //Shifting counter 

    puts("Enter you binary values");
    cout << "Multiplicand     =  ";
    cin >> a;
    cout<<endl;

    cout << "Multiplier     =   ";
    cin >> b;
    cout << endl;

    //Set a pointer that looks at the multiplier from the bit on the most right 
    int j = b.size() - 1;

   // Loop through the whole string and see if theres any 1's
    while (j >= 0)
    {
        if (b[j] == '1')
        { 
            //Reassigns the original value every loop to delete the old shifting 
            temp = a;


            //We shift by adding zeros to the string of bits
            //If it is not the first iteration it wont add any thing because we did not "shift" yet
            temp.append(shifter, '0');
                
            //Add the shifter buffer bits to the result variable 
            result = addBinary(result, temp);
        }

        //we shifted one place 
        ++shifter; 
        
        //move to the next bit on the left
        j--;
    }


    cout << "Result     = " << result << endl;


    return 0;
}
于 2021-01-04T01:18:41.270 に答える