【发布时间】:2012-01-03 13:27:36
【问题描述】:
我目前正在使用 C++ 模拟 MIPS 处理器,用于一个 comp 架构类,并且在从十进制数转换为二进制数(双向有符号数)时遇到了一些问题。直到最后一点,一切都运行良好,因为我当前的算法在 1
//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;
}
为了完整性,我还包括了我的其他算法。对于缺少 cmets,我深表歉意,但这很简单。
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;
}
另外,如果有人知道更有效地编写这些内容的任何好方法,我很想听听。我只上过两门编程入门课程,但一直在尝试不同的技术,看看我有多喜欢他们的风格。
【问题讨论】:
-
改变效率的一个选项是一次工作 4 位,将每个 nybble 映射到相应的 4 字符字符串。这将减少字符串分配。我还会考虑以 MSB 到 LSB 的顺序生成答案,而不是反之亦然,因此您可以使用
binary += pattern[nybble];。在右侧扩展字符串可能(几乎无法衡量)比在左侧有效插入的位置更有效。 -
除非我真的需要自己进行转换,否则我会使用
std::bitset来处理转换和打印:std::cout << std::bitset<32>(a);。 -
除了像@JonathanLeffler 所说的那样从左到右工作,我建议您预先分配整个字符串,因为您知道输出将是 32
chars。根据您的字符串实现,它可能会或可能不会有所不同,但它肯定不会受到伤害。