如何快速将由空格分隔的1和0字符串转换为bitset
?
存在一个构造函数,用于从不用空格分隔的字符串初始化bitset
,一个用于将bitset
初始化为全零或一,以及一个用整数初始化。 我能想到三个方面:
位数为24,每个字符串恰好有24位,不多也不少。
编辑: Here是我用来测试效果的代码,here是方法一和二的代码。在我的机器上,方法1需要3毫秒,方法3需要14毫秒。
编辑2:我使用-O3 -o -g --std=c++11
是我的编译器设置。我使用了gcc 和 clang。
答案 0 :(得分:1)
通过相应地设置每个位,将转换(不改变输入字符串)转换为无符号整数:
#include <bitset>
constexpr unsigned long long
extract_bits(const char* ptr, unsigned long long accumulator) {
return (*ptr == 0)
? accumulator
: extract_bits(ptr + 1, (*ptr == '1')
? accumulator << 1u | 1u
: (*ptr == '0')
? accumulator << 1
: accumulator);
}
template <unsigned N>
constexpr std::bitset<N>
to_bitset(const char* ptr) {
return std::bitset<N>(extract_bits(ptr, 0));
}
#include <iostream>
int main()
{
constexpr auto b = to_bitset<24>("0 0 1 1 0 0 1 1 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 0");
std::cout << b << '\n';
return 0;
}
注意:转换会忽略&#39; 0&#39;之外的任何字符。和&#39; 1&#39;安静地(像#34; 01-01和#34这样的字符串也是有效的。)
获取上述转换时间并从字符串中删除空格:
#include <algorithm>
#include <cctype>
#include <cstring>
#include <chrono>
#include <iostream>
#include <random>
using namespace std::chrono;
void print_duration(const char* what, const system_clock::time_point& start, const system_clock::time_point& stop) {
auto duration = duration_cast<microseconds>(stop - start);
std::cout << what << ": " << duration.count() << std::endl;
}
volatile unsigned long long result;
int main()
{
std::string str = "0 0 1 1 0 0 1 1 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 0";
std::vector<std::string> strings(1000, str);
std::random_device random_device;
std::mt19937 random_generator(random_device());
for(auto& str : strings) {
std::shuffle(str.begin(), str.end(), random_generator);
}
// Non mutating to_bitset
{
auto start = system_clock::now();
for(const auto& str : strings) {
auto b = to_bitset<24>(str.c_str());
result = b.to_ullong();
}
auto stop = system_clock::now();
print_duration("to_bitset", start, stop);
}
// Erasing spaces
{
auto start = system_clock::now();
for(auto& str : strings) {
str.erase(std::remove_if(str.begin(), str.end(), ::isspace), str.end());
auto b = std::bitset<24>(str);
result = b.to_ullong();
}
auto stop = system_clock::now();
print_duration("str.erase", start, stop);
}
return 0;
}
g ++ 4.8.4 with g ++ -std = c ++ 11 -O3显示:
to_bitset
比erasing spaces from a string/constructing a bitset
快约3倍。