在计算负数的二进制补码时如何实现"+1"加法

how can I implement adding "+1" step when calculating two's complement for a negative number

本文关键字:实现 何实现 加法 计算 二进制 补码      更新时间:2023-10-16

该程序适用于任何给定长度的无符号整数,但对于负整数,如果整数为 -99 且长度为 8,则输出10011100,但正确答案10011101。 因此,基本上,缺少"+1"步骤。如何在不添加新库或使用数组的情况下对其进行编码?

$

#include <iostream>
#include "math.h"
#include <string>
using namespace std;
// DONT MAKE ANY ADDITION
// DONT USE ANY ARRAY DATA TYPE
string decimalToTwoComplimentString(int a, int length)
{
int bitSize=0;
string binary, r_bin;
for(int j=abs(a); j>=0; j/=2)
{
if(a>=0) // NO PROBLEM HERE
{
if(bitSize!=length)
{
if(j%2==0)
binary.append("0");
else if(j%2==1)
binary.append("1");
bitSize++;
}
else if(bitSize==length)
{
break;
}
}
else if(a<0) // ADDING +1 AT THE END PART IS MISSING!
{
if(bitSize!=length)
{
if(j%2==0)
binary.append("1");
else if(j%2==1)
binary.append("0");
bitSize++;
}
else if(bitSize==length)
{
break;
}
}
}
for(int i=binary.length()-1; i>=0; i--) // PRINTING STRING BACKWARDS
{
r_bin+=binary.at(i);
}
return r_bin;
}
int main()
{
int L;
cout<< "Enter bit pattern size";
cin>>L;
int a, b;
cout<<"Enter an integer a ";
cin>>a;
cout<<"Enter an integer b ";
cin>>b;
int c1 = a + b;
cout<<"In decimal "<< a << " + " << b << " is " << c1 << endl;
string A = decimalToTwoComplimentString(a, L);
string B = decimalToTwoComplimentString(b, L);
cout<< "The Two's complement of " << a << " is t" << A << endl;
cout<< "The Two's complement of " << b << " is t" << B << endl;

system("Pause");
return 0;
}

与其尝试通过不断除以 2 并检查是否有偶数或奇数值来转换为字符串,不如简单地使用按位运算。如果你这样做了,你就不需要区分负值和正值,因为你一次只看一个位。您可以通过使用 shift right 运算符、>>和位掩码来获得最低有效位来实现相同的目标。像这样:

string decimalToTwoComplimentString(int a, int length)
{
string binary;
for (int i = 0; i < length; ++i)
{
if (a & 0x01)
{
binary.append("1");
}
else
{
binary.append("0");
}
a = a >> 1;
}
// ... and then reverse it
}

所以这里发生的事情是,我们正在对输入值a的位进行操作。逻辑 AND 运算符 (&) 取 2 个值并按位执行 AND 操作。这意味着它从左操作数中获取位 0,从右操作数中获取位 0,并询问它们是否都等于 1。如果是这样,则结果为 1,否则结果为 0。然后它对位 1、位 2 等执行相同的操作。当你有a & 0x01时,第一个操作数是a,第二个操作数是十六进制值 01,它只是 1。所以只设置了位 0。其他 32 位为 0。这意味着&将为位 1-31 返回 0。但对于位 0,结果将是位 0 中a的任何结果。

然后,>>运算符将所有位 1 向右移动。最低位从末尾掉落,再也听不到任何声音。我们再次做同样的事情,直到我们到达第 32 位。