我正在尝试为存储在两个数组 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/