c++ - C++ 中的长手乘法

标签 c++ arrays binary multiplication

我正在尝试为存储在两个数组 BeforeDecimal1 和 BeforeDecimal2 中的 8 位二进制数实现长手乘法。问题是我总是得到错误的结果。我试图弄清楚这个问题,但做不到。这是代码:

与之前的代码相比,这是一个更加精炼的代码。它正在给我结果,但结果不正确。

int i=0,carry=0;

while(true)
{
    if(BeforeDecimal2[i]!=0)
        for(int j=7;j>=0;j--)
        {
            if(s[j]==1 && BeforeDecimal1[j]==1 && carry==0)
            {
                cout<<"Inside first, j= "<<j<<endl;
                carry=1;
                s[j]=0;
            }
            else
                if(s[j]==1 && BeforeDecimal1[j]==0 && carry==1)
                {
                    cout<<"Inside second, j= "<<j<<endl;
                    carry=1;
                    s[j]=0;
                }
                else
                    if(s[j]==0 && BeforeDecimal1[j]==0 && carry==1)
                    {
                        cout<<"Inside third, j= "<<j<<endl;
                        carry=0;
                        s[j]=1;
                    }
                    else
                        if(s[j]==0 && BeforeDecimal1[j]==0 && carry==0)
                        {
                            cout<<"Inside fourth, j= "<<j<<endl;
                            carry=0;
                            s[j]=0;
                        }
                        else
                            if(s[j]==0 && BeforeDecimal1[j]==1 && carry==0)
                            {
                                cout<<"Inside fifth, j= "<<j<<endl;
                                carry=0;
                                s[j]=1;
                            }

                            else
                                if(s[j]==1 && BeforeDecimal1[j]==1 && carry==1)
                                {
                                    //cout<<"Inside fifth, j= "<<j<<endl;
                                    carry=1;
                                    s[j]=1;
                                }
                                else
                                    if(s[j]==1 && BeforeDecimal1[j]==0 && carry==0)
                                    {
                                        //cout<<"Inside fifth, j= "<<j<<endl;
                                        carry=0;
                                        s[j]=1;
                                    }
                                    else
                                        if(s[j]==0 && BeforeDecimal1[j]==1 && carry==1)
                                        {
                                            //cout<<"Inside fifth, j= "<<j<<endl;
                                            carry=1;
                                            s[j]=0;
                                        }

        }

        for(int h=7;h>=0;h--)
        {
            if(h==0)
            {
                BeforeDecimal1[0]=0; // that is inserting zeros from the right
            }
            else
            {
                BeforeDecimal1[h]=BeforeDecimal1[h-1];
                BeforeDecimal1[h-1]=0;
            }

        }
    if(i==3)
        break;

    i++;
}

问候

最佳答案

也许备份并从存储为 8 位二进制数的 8 位二进制数开始是最简单的。就像我们做十进制乘法一样,我们从一些数字开始。我们将乘以这些单个数字的值,并将它们相加以获得最终结果。不同之处(或一个明显的不同之处)在于,因为我们以二进制形式工作,所以我们所有的数字都代表 2 的幂,因此我们可以通过简单地对输入进行位移来获得每个中间结果。

由于它是二进制的,我们对每个数字只有两种可能性:如果它是 0,那么我们需要将 0 乘以另一个向左移动适当位数的数字。显然,0 时间仍然是 0,所以在这种情况下我们什么都不做。另一种可能性是我们有一个 1,在这种情况下,我们将 1 乘以另一个向左移动适当位置的数字。

例如,让我们考虑 17 x 5 或(二进制)10001 x 101。

     10001
       101
    ------
     10001
 + 1000100
  --------
 = 1010101      

将其转换为更易于识别的内容,我们得到 0x55,或 85d

在代码中,该过程相当简短。从结果 0 开始。检查一个操作数中的最低有效位是否已设置。如果是,则将另一个操作数添加到结果中。将一个操作数向右移动一点,另一个操作数向左移动一点,然后重复直到你向右移动的操作数等于 0:

unsigned short mul(unsigned char input1, unsigned char input2) { 
    unsigned short result = 0;

    while (input2 != 0) {
        if (input2 & 1)
            result += input1;
        input1 <<= 1;
        input2 >>= 1;
    }
    return result;
}

如果要处理有符号数,通常最简单的方法是分别计算结果的符号,然后对绝对值进行乘法运算。

关于c++ - C++ 中的长手乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13666591/

相关文章:

c++ - x86_64 的 Cmake 错误 undefined symbol

c++ - 使用 map 查找 vector 中的多模式

Php PDO 想要从 2 列中获取值并创建数组(一列值作为键,另一列作为数组)

c - C unsigned shorts 中的值是如何存储的?

php mysql 更新 blob

二进制减法与 2 的补码

c++ - 透明比较器代码最小化

c++ - 为 Vim 调整 C++ IDE 插件

arrays - 将字节数组从 C 传递到 Lua

java - 如何迭代二维数组java