由于本学期在物理学院学习了数字系统课程,我决定尝试将我们在那里学到的东西应用到我自学成才的编程实践中。是的,出于某种原因,我们根本不这样做。无论如何,下面是我的代码:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int num = 0;
int power = 0; // used to calculate the power of the digit later
vector<int> binVec; // holds binary value
vector<int> decVec; // holds converted dec value
cout << "Input binary number for conversion to its decimal...\n";
while (cin >> num)
{
binVec.push_back(num);
}
for (vector<int>::size_type i = 0; i<= binVec.size(); i++)
{
int temp;
temp = (binVec[i]*2)^power;
decVec.push_back(temp);
if (power = 0)
{
power = 2;
}
else
{
power = power * 2;
}
}
cout << "The decimal value is \n";
for (vector<int>::size_type j = 0; j<= decVec.size(); j++)
{
cout << decVec[j];
}
return 0;
}
不用说,它无法正常工作。我在开始的时候犯了一些愚蠢的错误,但现在大约半小时我用它开了头,我得到了奇怪的输出。例如,当我输入simple(10)bin并期望a(2)dec时,我得到一个以2开头的数字字符串,如20006721.此外,当程序运行时,我的编译器发送错误消息。可能有什么不对?
我知道我的代码很糟糕,并且没有很好地优化,所以任何反馈或责骂都会非常感激!
答案 0 :(得分:1)
你的if语句有错字:
if (power = 0)
您需要使用==
进行比较:
if (power == 0)
此外,在你的for循环中,你对它进行了一次运行:
i <= binVec.size();
数组的索引从0到大小-1;所以做<=
会导致未定义的行为,以访问向量范围之外的地址。将其更改为:
i < binVec.size();
答案 1 :(得分:1)
您的算法存在缺陷。例如,每个二进制数字输出一个十进制数字。但是,对于大多数二进制数,十进制数的长度将更小。
此外,“^”运算符是C ++中的二进制XOR运算符,而不是幂运算符。
而不是你的主循环,我建议像这样:
int decimalNumber = 0;
for (vector<int>::size_type i = 0; i < binVec.size(); i++)
{
// Note that I changed "less or equal" to "less than"
decimalNumber *= 2;
decimalNumber += (binVec[i]);
}
cout << decimalNumber;
答案 2 :(得分:0)
使用STL中的accumulate()算法的较短版本:
#include <iostream>
#include <numeric>
#include <iterator>
using namespace std;
int main()
{
cout << "Input binary number for conversion to its decimal..." << endl;
cout << "The decimal value is: "
<< accumulate(istream_iterator<bool>(cin), istream_iterator<bool>(), 0,
[](int a, int b) { return (a << 1) + b; })
<< endl;
}
答案 3 :(得分:0)
指出了一些错误。尚未提到您正在做一些相当奇怪的事情 - 即,使用^
运算符进行异或。我想知道您是否打算将其用作power
操作?
以下是建议的转换 - 使用基本的字符串操作。
char* inputString = "101001010";
int ii, dec=0;
for(ii=0; ii<strlen(inputString); ii++) {
if(*(inputString+ii)=='1') {
dec = 2 * dec + 1;
}
else {
dec = 2 * dec;
}
}
printf("the conversion to digital is %d\n", dec);
另一种选择 - 在ASCII表中使用'0'和'1'彼此相邻的事实:
char* inputString = "101001010";
int ii, dec=0;
for(ii=0; ii<strlen(inputString); ii++) {
dec = 2 * dec + (int)(inputString[ii]-'0');
}
printf("the conversion to digital is %d\n", dec);
答案 4 :(得分:0)
您有一些简单的语法/语义错误,以及您想要考虑的概念性问题。首先,要小心分配/相等测试,你真的不需要在零但是1开始供电(因为2 ^ 0 = 1),
以下是您的代码的一部分,已修复,
int main()
{
int num = 0;
int bits=0; // you could use bitshift, rather than multiply
int power=1; // 2^0 = 1, so start power at 1, not 0
你循环将每个位位置转换为数字,但是你不会累积它们,考虑push_back(temp)与accum + = temp
的结果 int temp;
int accum=0;
bitpos=0; power=1;
for (vector<int>::size_type i=0; i<binVec.size(); i++)
{
temp = (binVec[i])*power;
decVec.push_back(temp);
accum += (binVec[i])<<bitpos;
bitpos++; power*=2;
}
由于您转换每个十进制数字,您有一个十进制值列表,但这些不是单个数字,它们是基于向量中位置的2(2 ^ n)的幂。您可能更喜欢存储在accum(ulator)中的值。当你查看结果时,这很清楚,在每个向量元素之间打印一个逗号“,”
cout << "The decimal values are ";
for (vector<int>::size_type j=0; j<decVec.size(); j++)
{
cout << decVec[j] << ",";
}
cout<<endl;
cout << "The decimal value is \n" << accum << endl;
结果,
./bin2dec
Input binary number for conversion to its decimal: 1 1 1 1 1 1 1 0
The decimal values are 1,2,4,8,16,32,64,0,
The decimal value is
127
这说明了你的最后一个概念项,即你的程序认为最左边的数字最不重要,这可能是你的意图,但是具有抵抗力。这可以通过在最右边的值启动电源/ bitpos来解决,
int temp;
int accum=0;
//bitpos=0; power=1;
bitpos=(int)binVec.size()-1; power=2<<bitpos;
for (vector<int>::size_type i=0; i<binVec.size(); i++)
{
temp = (binVec[i])<<bitpos;
accum += (binVec[i])<<bitpos;
decVec.push_back(temp);
//bitpos++; power*=2;
bitpos--; power/=2;
}
这给出了更期望的结果,
./bin2dec
Input binary number for conversion to its decimal: 1 1 1 1 1 1 1 0
The decimal values are 128,64,32,16,8,4,2,0,
The decimal value is
254