Как преобразовать десятичное число в двоичное и вставить все его двоичные числа di git в двумерный вектор? - PullRequest
0 голосов
/ 18 апреля 2020

если входные данные:

73 68 69 65

выходные данные должны выглядеть следующим образом:

0 1 0 0 1 0 0 1 ///73 in binary form
0 1 0 0 0 1 0 0 ///68 in binary form
0 1 0 0 0 1 0 1 ///69 in binary form
0 1 0 0 0 0 0 1 ///65 in binary form

Матрица имеет 8 столбцов, как указано выше, и каждая строка содержит двоичную форму десятичное число.

На данный момент это мой код:

    int n, x;
    cin >> n;

    auto A = vector<vector<int>>(n, vector<int>(8)); ///8 columns as mentioned

    while (n--)
    {

        cin >> x;
        for (int j = 8; j >= 0; --j) ///inserting the digits for each number
            if ((x >> j) & 1)
                A[i].emplace_back(1);
            else
                A[i].emplace_back(0);
    }

    for (auto rows : A)
    {
        for (auto elements : rows)
            cout << elements << " ";
        cout << "\n";
    }

Я пытался использовать побитовую операцию, но для меня подойдет любой метод, использующий vector<vector<int>>.

Если бы вы могли ответить, это было бы очень признательно, спасибо за чтение и ответы!

Также вторая проблема, она показывает мне 16 ди git 000000000001001001 вместо 01001001, много нулей в начале, если на входе, например, 73.

1 Ответ

1 голос
/ 18 апреля 2020

Основная проблема, лежащая в основе вашего решения, заключается в том, что тип Int хранится не в одном байте. Я разработал решение, которое соответствует вашему коду.

Примечание. Я храню входные данные в неподписанном символе, который хранится в один байт (вместо использования int), при этом входное значение, считанное из cin, является символом, например: '8', поэтому, учитывая таблицу ASCII, я могу получить число, представленное символом, вычитающим 48 (см. таблицу ASCII для объяснение):

int main()
{
    int n;
    unsigned char x;
    cin >> n;

    auto A = vector<vector<int> >(n); ///8 columns as mentioned

    while (n--)
    {
        cin >> x;
        x -= 48;
        auto aByte = vector<int>(8);

        for (int j = 0; j < 8 ; ++j) ///inserting the digits for each number
        {
            if ( (x >> j) & 0x01 )
                aByte[7 - j] = 1;
            else
                aByte[7 - j] = 0;
        }
         A[n] = aByte;
    }

    for (auto rows : A)
    {
        for (auto elements : rows)
            cout << elements << " ";
        cout << "\n";
    }
}

вышеупомянутое решение работает только для одного числа di git, для большего количества цифр (но не более одного байтового представления) вы можете преобразовать его в int, а затем привести int к unsigned. char, просто замените эти строки кода:

cin >> x;
x -= 48;

на эти:

int i;
cin >> i;
x = static_cast<unsigned char>(i);
...