我目前正在为计算机体系结构课程编写 MIPS 处理器的 C++ 模拟程序,但在将十进制数转换为二进制数时遇到了一些问题(包括有符号数)。一切都很顺利,直到最后一位,因为我的当前算法超出了 int 上 1<<=31 的范围。只需要一个指引来帮助我解决这个问题。谢谢!
//Assume 32 bit decimal number
string DecimalToBinaryString(int a)
{
string binary = "";
int mask = 1;
for(int i = 0; i < 31; i++)
{
if((mask&a) >= 1)
binary = "1"+binary;
else
binary = "0"+binary;
mask<<=1;
}
cout<<binary<<endl;
return binary;
}
为了完整性,我也包含了我的另一个算法。对于缺乏注释的情况,我向您道歉,不过这个算法相当简单。
int BinaryStringToDecimal(string a)
{
int num = 0;
bool neg = false;
if(a.at(0) == '1')
{
neg = true;
for(int x = a.length()-1; x >= 0; x--)
{
if(a.at(x) == '1')
a.at(x) = '0';
else a.at(x) = '1';
}
a.at(a.length()-1) += 1;
for(int x = a.length()-1; x >= 0; x--)
{
if(a.at(x) == '2')
{
if(x-1 >= 0)
{
if(a.at(x-1) == '1')
a.at(x-1) = '2';
if(a.at(x-1) == '0')
a.at(x-1) = '1';
a.at(x) = '0';
}
}
else if(a.at(x) == '3')
{
if(x-1 >= 0)
a.at(x-1) += '2';
a.at(x) = '1';
}
}
if(a.at(0) == '2')
a.at(0) = '0';
else if(a.at(0) == '3')
a.at(0) = '1';
}
for(int x = a.length()-1; x >= 0; x--)
{
if(a.at(x) == '1')
num += pow(2.0, a.length()-x-1);
}
if(neg)
num = num*-1;
return num;
}
如果有人知道更好的方法来更高效地编写这些代码,我会很乐意听取建议。我只上过两个入门级的编程课程,但一直在尝试不同的技术,以了解它们的风格和效果如何。
binary += pattern[nybble];
。在右侧扩展字符串可能比你现在的左侧插入方式更有效(几乎无法测量)。 - Jonathan Lefflerstd::bitset
来处理转换和打印:std::cout << std::bitset<32>(a);
。 - Jerry Coffin