как разделить входные значения на 4-значный вектор, например, n бит на полубайт на вектор части? - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть проект для передачи звуковой волны для связи с ПК.

Первый шаг состоит в том, что вход представляет собой строку двоичных файлов переменной длины (длина может быть 128 бит / цифр или 256 бит / цифр,до тех пор, пока количество цифр делится на 4), и эта длина вставляется в вектор, а каждый вектор содержит полубайт или 4 бита, поэтому я могу преобразовать его в шестнадцатеричный и затем использовать его, чтобы определить, какой тон DTMF он должен передать,

Я написал код в классе, где функция вектора расщепления цифр называется std :: vector splitbit ();

Причина, по которой я вызвал short int, потому что мое приложение не хочетзанять слишком много места.

Я пробовал с набором битов, но он работает только с постоянным числом. Если я использовал vector, он может работать, но код будет слишком длинным и тратить много ресурсов.

Входные данные записываются в unsigned long long int, но целое число может принимать только 20 цифр (2 ^ 64)

Это код заголовка:

#pragma once
#include "stdafx.h"
class dtmf
{
private:
    unsigned int decimal,remainder,power;
    unsigned long long int bit;
    std::vector<std::vector<unsigned short>> dtmffreq;
    std::vector<unsigned short>selectfreq[16], index, bitsplit;
//  std::vector<unsigned unsigned long long int> bitlen[128];
public:
    dtmf();
    void inifreq();
    void printfreq();
    void bitinput();
    std::vector<unsigned short> getfreq();
    std::vector<unsigned short int> splitbit();
    unsigned int bit2dec();
};

Это функция ввода:

void dtmf::bitinput()
{
    std::cin >> bit;
}

std::vector<unsigned short int> dtmf::splitbit()
{
    for (size_t i = 0; i < 4; i++)
    {
        bitsplit.push_back((bit/=10)%10);
    }
    return bitsplit;
}

Когда я отлаживаю систему, вывод только бит-сплитдает по одному биту за раз, как если бы я записал 1101, вывод будет {1,1,0,1}, а если я напишу 11000110, я получу {1,1,0,0,0,1,1,0}(если я изменю i на 8), а не {1100,0110}.

1 Ответ

1 голос
/ 05 ноября 2019

, потому что вы не очищаете bitsplit в функции dtmf::splitbit(). сделайте так:

std::vector<unsigned short int> dtmf::splitbit()
{
    std::vector<unsigned short int> output;
    for (size_t i = 0; i < 4; i++)
    {
        output.push_back((bit/=10)%10);
    }
    return output;
}

Или если вы хотите остаться с bitsplit:

std::vector<unsigned short int> dtmf::splitbit()
{
    bitsplit.clear(); //<- this is new
    for (size_t i = 0; i < 4; i++)
    {
        bitsplit.push_back((bit/=10)%10);
    }
    return bitsplit;
}
...