【问题标题】:how do i split input values into 4 digit vector, like n bits into nibble per part vector?如何将输入值拆分为 4 位向量,例如将 n 位拆分为每个部分向量的半字节?
【发布时间】:2019-11-05 14:00:20
【问题描述】:

我有一个项目可以传输声波与电脑通信。

第一步是输入一个可变长度的二进制字符串(长度可以是 128 位/位或 256 位/位,只要位数可以被 4 整除),然后插入该长度成一个向量,每个向量都包含一个半字节或 4 位,所以我可以将它转换为十六进制,然后用它来确定它应该传输哪个 DTMF 音。

我在一个类中写了代码,其中数字分裂向量的函数称为std::vector splitbit();

之所以调用 short int 是因为我的应用程序不想占用太多空间。

我尝试过使用 bitset,但它只适用于常量。如果我使用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;
}

当我调试系统时,bitsplit 的输出一次只给出一个位,比如如果我写 1101,输出是 {1,1,0,1},如果我写 11000110 我得到 {1, 1,0,0,0,1,1,0}(如果我将 i 更改为 8)而不是 {1100,0110}。

【问题讨论】:

  • 我试过for (size_t i = 0; i &lt; ceil(log10(bit)); i++) { bitsplit.push_back((bit/=10000)); } bur 我没有得到想要的结果。

标签: c++ vector bit digits


【解决方案1】:

因为你没有在dtmf::splitbit() 函数中清除bitsplit。 变成这样:

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

【讨论】:

  • 这不是我想要的,如果我写 bit/=10)%10,我的 11000010 数组将变为 {1,1,0,0,0,0,1,0} 而不是 { 1100,0010} 或 {1100,10}。
  • 如果我将位除以 10000,我每次都会删除 4 位数字,但问题是我不会每次都从输入中提取 4 位数字。
猜你喜欢
  • 2018-08-09
  • 2011-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-18
  • 2011-03-20
相关资源
最近更新 更多