如何在位级别添加两个二进制数时忽略一个位块

How to neglect a a block of bits while adding two binary numbers at bit level

本文关键字:一个 二进制数 两个 添加      更新时间:2023-10-16

我被分配了一个位级二进制算术项目。我做了一个函数,它成功地添加了两个忽略溢出的二进制数。出于某种原因,我想通过传递一个参数来忽略数字中的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);
}