В настоящее время я работаю над симуляцией MIPS-процессора в С++ для класса архитектуры Comp и с некоторыми проблемами, переходящими из десятичных чисел в двоичные (подписанные числа в обоих направлениях). Все работает нормально до самого последнего бита, потому что мой текущий алгоритм выходит за пределы областей для 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;
}
Также, если кто-нибудь знает какие-нибудь хорошие способы, чтобы писать о них более эффективно, я бы хотел его услышать. У меня были только два вводных класса программирования, но я играл с разными приемами, чтобы увидеть, насколько мне нравится их стиль.