我有一个传输声波以与 pc 通信的项目。
第一步,输入的是一串可变长度的二进制(长度可以是128位/位,也可以是256位/位,只要位数能被4整除即可),插入该长度转换成一个 vector ,每个 vector 都包含一个半字节或 4 位,所以我可以将它转换成十六进制,然后用它来确定它应该传输哪种 DTMF 音调。
我在一个类中编写代码,其中数字拆分 vector 的函数称为 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}。
最佳答案
因为你没有在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;
}
关于c++ - 如何将输入值拆分为 4 位 vector ,例如将 n 位拆分为每个部分 vector 的半字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58712955/