簡體   English   中英

C++ 二進制輸入作為字符串到十進制

[英]C++ binary input as a string to a decimal

我正在嘗試編寫一個將二進制數輸入作為字符串的代碼,如果不應該顯示錯誤消息,則只接受 1 或 0。 然后它應該通過一個數字一個數字的循環將二進制數作為字符串轉換為十進制數。 我似乎無法正確理解我的事實是它只會接受正確的 1 或 0。 但是當它進入計算時就會出現問題,我似乎無法正確理解。 目前這是我相信我必須讓它工作的最接近的。 誰能給我一個提示或幫助我解決我做錯了什么?

#include <iostream>
#include <string>
using namespace std;

string a;

int input();

int main()
{
    input();
    int decimal, x= 0, length, total = 0;
    length = a.length();
    // atempting to make it put the digits through a formula backwords.
    for (int i = length; i >= 0; i--)
    {
// Trying to make it only add the 2^x if the number is 1
        if (a[i] = '1')
        {
            //should make total equal to the old total plus 2^x if a[i] = 1
            total = total + pow(x,2);
        }
        //trying to let the power start at 0 and go up each run of the loop
        x++;
    }

    cout << endl << total;
    int stop;
    cin >> stop;
    return 0;
}

int input()
{
    int x, x2, count, repeat = 0;

    while (repeat == 0)
    {
        cout << "Enter a string representing a binary number => ";
        cin >> a;
        count = a.length();

        for (x = 0; x < count; x++)
        {

            if (a[x] != '0' && a[x] != '1')
            {
                cout << a << " is not a string representing a binary number>" << endl;
                repeat = 0;
                break;

            }
            else
                repeat = 1;



        }

    }
    return 0;
}
  • 我認為pow適合整數計算。 在這種情況下,可以使用移位運算符。
  • a[i] = '1'a[i]的值設置為'1'並返回'1' ,這始終是正確的。
  • 您不應該訪問a[length] ,這應該毫無意義。

固定代碼:

int main()
{
    input();
    int decimal, x= 0, length, total = 0;
    length = a.length();
    // atempting to make it put the digits through a formula backwords.
    for (int i = length - 1; i >= 0; i--)
    {
// Trying to make it only add the 2^x if the number is 1
        if (a[i] == '1')
        {
            //should make total equal to the old total plus 2^x if a[i] = 1
            total = total + (1 << x);
        }
        //trying to let the power start at 0 and go up each run of the loop
        x++;
    }

    cout << endl << total;
    int stop;
    cin >> stop;
    return 0;
}

我會用這種方法...

#include <iostream>

using namespace std;

int main()
{
    string str{ "10110011" }; // max length can be sizeof(int) X 8
    int dec = 0, mask = 1;

    for (int i = str.length() - 1; i >= 0; i--) {
        if (str[i] == '1') {
            dec |= mask;
        }
        mask <<= 1;
    }

    cout << "Decimal number is: " << dec;


    // system("pause");
    return 0;
}

我在您的代碼中看到多個錯位。

  1. 您的for循環應從i = length - 1而不是i = length
  2. a[i] = '1'a[i]'1' ,並且不對其進行比較。
  3. pow(x,2)表示x ^ 2 http://latex.codecogs.com/gif.download?x%5E2而不是2 ^ x http://latex.codecogs.com/gif.download?2%5Ex pow也不適合整數運算。 請改用2*2*...1<<e

也有更短的方法來實現它。 這是我將如何做的一個例子:

std::size_t fromBinaryString(const std::string &str)
{
    std::size_t result = 0;
    for (std::size_t i = 0; i < str.size(); ++i)
    {
        // '0' - '0' == 0 and '1' - '0' == 1.
        // If you don't want to assume that, you can use if or switch
        result = (result << 1) + str[i] - '0';
    }
    return result;
}

適用於高達 32 位的二進制字符串。 將整數換出 long 以獲得 64 位。

#include <iostream>
#include <stdio.h>
#include <string>

using namespace std;

string getBinaryString(int value, unsigned int length, bool reverse) {
    string output = string(length, '0');
    if (!reverse) {
        for (unsigned int i = 0; i < length; i++) {
            if ((value & (1 << i)) != 0) {
                output[i] = '1';
            }
        }
    }
    else {
        for (unsigned int i = 0; i < length; i++) {
            if ((value & (1 << (length - i - 1))) != 0) {
                output[i] = '1';
            }
        }
    }
    return output;
}

unsigned long getInteger(const string& input, size_t lsbindex, size_t msbindex) {
    unsigned long val = 0;
    unsigned int offset = 0;
    if (lsbindex > msbindex) {
        size_t length = lsbindex - msbindex;
        for (size_t i = msbindex; i <= lsbindex; i++, offset++) {
            if (input[i] == '1') {
                val |= (1 << (length - offset));
            }
        }
    }
    else { //lsbindex < msbindex
        for (size_t i = lsbindex; i <= msbindex; i++, offset++) {
            if (input[i] == '1') {
                val |= (1 << offset);
            }
        }
    }
    return val;
}

int main() {
    int value = 23;
    cout << value << ": " << getBinaryString(value, 5, false) << endl;
    string str = "01011";
    cout << str << ": " << getInteger(str, 1, 3) << endl;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM