在计算负数的二进制补码时如何实现添加“+1”步骤

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

对于任何给定长度的无符号整数,该程序都能正常工作,但对于负整数,如果整数为 -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 并检查您的值是偶数还是奇数来尝试转换为字符串,您应该简单地使用按位运算。如果你这样做了,你就不需要区分负值和正值,因为你一次只看一个位。您可以通过使用右移运算符 >> 和位掩码来获得最低有效位来实现相同的目的。像这样:

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。这意味着 & 将 return 0 位 1-31。但是对于位 0,结果将是 a 在位 0 中的任何内容。

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