c++ - 如何将输入值拆分为 4 位向量,例如将 n 位拆分为每个部分向量的半字节?
问题描述
我有一个项目来传输声波与电脑通信。
第一步是输入是可变长度的二进制字符串(长度可以是 128 位/位或 256 位/位,只要位数可以被 4 整除),然后将该长度插入到向量中每个向量都包含一个半字节或 4 位,因此我可以将其转换为十六进制,然后使用它来确定它应该传输的 DTMF 音调。
我在一个类中编写了代码,其中数字分割向量的函数称为 std::vector splitbit();
我之所以调用 short int 是因为我的应用程序不想占用太多空间。
我尝试使用 bitset,但它只适用于一个常数。如果我使用矢量,它可能会起作用,但代码会太长并且浪费大量资源。
输入以 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}。
解决方案
因为你没有明确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;
}
推荐阅读
- python - 高阶函数 Python(永无止境?)
- python - 在对多数类进行欠采样后,让训练集 < 测试集是否可行?
- ios - @Published 和 .assign 对值更新没有反应
- python - 根据每行中的数据有效地将 pandas 数据帧转换为一个热点
- ruby-on-rails - 如何在自定义类上使用 ActiveModel 的验证和回调?
- java - 在不同主机上使用 Facebook 身份验证
- python - pyTelegramBotApi 无法获取 message_id
- react-native - 如何水平和垂直渲染平面列表?
- go - 阻止来自 gorilla/mux 的打开 URL 重定向
- c++ - 你能在一个向量中有一个字符串和一个整数吗?