我目前正在使用C ++模拟MIPS处理器,用于comp体系结构类,并且在从十进制数转换为二进制(双向签名数字)方面存在一些问题。一切正常,直到最后一位,因为我的当前算法在1<< = 31时落入int的界限范围之外。只需要朝着正确的方向轻推即可启动并运行。谢谢!
//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;
}
如果有人知道任何有效的方法来更有效地写这些,我很乐意听到它。我只有两门入门编程课程,但一直在玩不同的技术,看看我喜欢他们的风格。
答案 0 :(得分:60)
这些实际上有标准的单行。
#include <bitset>
std::string s = std::bitset< 64 >( 12345 ).to_string(); // string conversion
std::cout << std::bitset< 64 >( 54321 ) << ' '; // direct output
std::bitset< 64 > input;
std::cin >> input;
unsigned long ul = input.to_ulong();
答案 1 :(得分:4)
替换:
if((mask&a) >= 1)
使用:
if ((mask & a) != 0)
或:
if (mask & a)
你的问题是最后一位给你一个负数,而不是一个正数。
答案 2 :(得分:0)
1&lt;&lt; = 31的问题已在其他评论中得到解决。关于字符串的代码片段 - &gt; int转换,你有几个选择:
或者如果你真的想自己实现转换,请尝试以下代码:
int BinaryStringToDecimal(string a)
{
int Rslt = 0;
int Mask = 1;
for (int i = a.length()-1; i >= 0; --i, Mask <<= 1) {
if (a.at(i) != '0') {
Rslt |= Mask;
}
}
return (Rslt);
}
请注意,与您的代码相比,此代码处理负数的方式不同:在您的函数中,最高位将被视为符号。如果函数的字符串参数中最左边的位不在位置32(从右边计数),则函数可能会产生不正确的结果。在这里建议的代码中没有特殊的符号处理。但是如果你得到32位的字符串,其中最左边的'1',那么int结果中的MSB将是== 1,整数将是负数(应该是)
答案 3 :(得分:0)
为什么不能将int
投放到uint
?然后生成二进制字符串非常容易,因为您不必担心符号位。将二进制字符串转换为int
也是如此:将其构建为uint
,然后将其转换为int
:
string DecimalToBinaryString(int a)
{
uint b = (uint)a;
string binary = "";
uint mask = 0x80000000u;
while (mask > 0)
{
binary += ((b & mask) == 0) ? '0' : '1';
mask >>= 1;
}
cout<<binary<<endl;
return binary;
}
当然,你可以应用上面提到的优化,比如预先分配字符串缓冲区等。
走另一条路:
uint b = 0;
for (int i = 31; i >=0; --i)
{
b <<= 1;
if (a.at(i) == '1')
b |= 1;
}
int num = (int)b;
答案 4 :(得分:0)
我检查了你的代码,找不到任何错误。这是我用过的代码......
#include <iostream>
#include <string>
using namespace std;
int main ()
{
int a=1111165117;
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;
system("PAUSE"); //optional if not using ideone
return EXIT_SUCCESS; //optional if not using ideone
}
输出将为1001110001010110101111010011101。 我可以在ideone
上运行此功能