我被分配了一个位级二进制算术项目。我做了一个函数,它成功地添加了两个忽略溢出的二进制数。出于某种原因,我想通过传递一个参数来忽略数字中的n位,从而使它更加灵活。
例如,我想忽略 a 最右边的两个位并将其添加到 b 中。
a=111011
b= 101
+---------
1001111
这是我的函数定义。
void add( bool reg[], bool arr[], int sizereg, int sizearr, int cut)
{
int i=sizereg-1-cut;
int j=sizereg-sizearr;
bool carry=0,dummy;
for (i; i>=j-cut ; i--)
{
dummy=reg[i];
reg[i]= (!reg[i]) && (arr[i-j] !=carry) || reg[i] && (arr[i-j]==carry);
carry=(arr[i-j] &&dummy) || (dummy&&carry) || (arr[i-j]&&carry);
}
while (carry && (i+1))
{
dummy=reg[i];
reg[i]=(carry!=reg[i]);
carry=(carry==dummy);
i--;
}
我的程序适用于 cut=0,对于非零值的切割,它没有给出所需的结果。如何正确使用 cut 以忽略(剪切)reg 数组中的位数
PS:我不想使用左移技术。
我假设您有信心可以纠正cut
为 0 的add()
版本。然后,您可以编写两个函数。第一个函数只是实现add()
假设cut
为 0。
// Add reg and arr (cut is 0)
void add( bool reg[], bool arr[], int sizereg, int sizearr )
{
//...
}
具有cut
的第二个函数调用第一个函数,以将cut
视为 0 的方式调整参数。如果cut
位于高阶索引上,则只需减小大小即可。如果cut
位于低阶索引上,则还必须推进指针。
// cut > 0 means cutting the higher indices.
// cut < 0 means cutting the lower indices.
void add( bool reg[], bool arr[], int sizereg, int sizearr, int cut )
{
if (cut < 0) {
cut = -cut;
reg += cut;
}
add(reg, arr, sizereg - cut, sizearr);
}