0

由于本学期我在物理学校学习了数字系统课程,因此我决定尝试将我们在那里学到的知识应用到我的自学编程实践中。是的,出于某种原因,我们根本不这样做。无论如何,下面是我的代码:

#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;


 }

不用说,它不会正常工作。一开始我犯了一些愚蠢的错误,但是现在大约半个小时,我正在用它来破解它,我得到了奇怪的输出。例如,当我输入简单的 (10)bin 并期望 (2)dec 时,我得到一串以 2 开头的数字,例如 20006721。此外,当程序运行时,我的编译器会发送一条错误消息。有什么问题?

我知道我的代码很烂而且没有得到很好的优化,所以任何反馈或责骂都将不胜感激!

4

5 回答 5

1

你的算法有缺陷。例如,您为每个二进制数字输出一个十进制数字。但是,对于大多数二进制数,十进制数的长度会更小。

此外,“^”运算符是 C++ 中的二元异或运算符,而不是幂运算符。

而不是你的主循环,我会建议这样的事情:

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;
于 2013-10-22T22:17:10.000 回答
1

您的 if 语句有错字:

if (power = 0)

您需要==用于比较:

if (power == 0)

此外,在你的 for 循环中,你让它运行 1 次到多次:

i <= binVec.size();

数组的索引从 0 到 size - 1;这样做<=会导致访问向量范围之外的地址的未定义行为。将其更改为:

i < binVec.size();
于 2013-10-22T22:00:55.533 回答
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^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

这说明了您的最后一个概念项目,即您的程序认为最左边的数字最不重要,这可能是您的意图,但违反直觉。这可以通过从最右边的值开始 power/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
于 2013-10-22T22:57:59.413 回答
0

已经指出了一些错误。尚未提到您正在做一些相当奇怪的事情 - 即与^运算符进行 XOR。我想知道您是否打算将其用作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);

另一种选择 - 使用 '0' 和 '1' 在 ASCII 表中彼此相邻的事实:

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);
于 2013-10-22T22:28:19.267 回答
0

使用 STL 中的 accumal() 算法的较短版本:

#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;
}
于 2013-10-22T22:18:34.687 回答