A conversion (not mutating the input string) to unsigned integer by setting each bit accordingly:
#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;
}
Note: The conversion ignores any character besides '0' and '1' quietly (A string like "01-01" is valid, too).
Getting timings for above conversion and erasing spaces from a string with:
#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 shows:
to_bitset
is about 3 times faster than erasing spaces from a string/constructing a bitset
.