在计算负数的二进制补码时如何实现"+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 并检查是否有偶数或奇数值来转换为字符串,不如简单地使用按位运算。如果你这样做了,你就不需要区分负值和正值,因为你一次只看一个位。您可以通过使用 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 位。
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 用于AVX的ln(x)的实现,m256
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 如何实现内部实现依赖于模板参数的类
- 我的 PRNG 实现与我尝试复制的实现有何不同?