在计算负数的二进制补码时如何实现添加“+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 位。
对于任何给定长度的无符号整数,该程序都能正常工作,但对于负整数,如果整数为 -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 位。