#include <iostream>
#include <string>
#include <bitset>
#include <sstream>
#include <algorithm>
std::string binary_to_hex( const std::string& bits )
{
constexpr std::size_t MAX_BITS = 32 ;
std::ostringstream stm ;
stm << std::hex << std::bitset<MAX_BITS>( bits, 0, MAX_BITS ).to_ulong() ;
return stm.str() ;
}
// get the least significant 7 bits in a byte
std::string seven_bits( const std::string& hex_byte )
{
std::istringstream stm(hex_byte) ;
unsigned int b ;
stm >> std::hex >> b ;
return std::bitset<8>(b).to_string().substr(1) ;
}
std::string uintvar_to_decimal( const std::string& uintvar )
{
constexpr std::size_t MAX_BITS = 64 ;
const std::size_t NBYTES = std::min( uintvar.size()/2, MAX_BITS/8 ) ;
std::string bits ;
for( std::size_t i = 0 ; i < NBYTES ; ++i ) // for each byte
bits += seven_bits( uintvar.substr( i*2, 2 ) ) ; // add the 7 lsb to bits
std::ostringstream stm ;
stm << std::bitset<MAX_BITS>(bits).to_ullong() ; // convert to decimal number
return stm.str() ;
}
int main()
{
const std::string bits = "1111111100010010001101001011" ;
std::cout << binary_to_hex(bits) << '\n' ;
const std::string uintvar = "8a5c" ;
std::cout << uintvar_to_decimal(uintvar) << '\n' ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8Yml0c2V0PgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPGFsZ29yaXRobT4KCnN0ZDo6c3RyaW5nIGJpbmFyeV90b19oZXgoIGNvbnN0IHN0ZDo6c3RyaW5nJiBiaXRzICkKewogICAgY29uc3RleHByIHN0ZDo6c2l6ZV90IE1BWF9CSVRTID0gMzIgOwogICAgc3RkOjpvc3RyaW5nc3RyZWFtIHN0bSA7CiAgICBzdG0gPDwgc3RkOjpoZXggPDwgc3RkOjpiaXRzZXQ8TUFYX0JJVFM+KCBiaXRzLCAwLCBNQVhfQklUUyApLnRvX3Vsb25nKCkgOwogICAgcmV0dXJuIHN0bS5zdHIoKSA7Cn0KCi8vIGdldCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgNyBiaXRzIGluIGEgYnl0ZQpzdGQ6OnN0cmluZyBzZXZlbl9iaXRzKCBjb25zdCBzdGQ6OnN0cmluZyYgaGV4X2J5dGUgKQp7CiAgICBzdGQ6OmlzdHJpbmdzdHJlYW0gc3RtKGhleF9ieXRlKSA7CiAgICB1bnNpZ25lZCBpbnQgYiA7CiAgICBzdG0gPj4gc3RkOjpoZXggPj4gYiA7CiAgICByZXR1cm4gc3RkOjpiaXRzZXQ8OD4oYikudG9fc3RyaW5nKCkuc3Vic3RyKDEpIDsKfQoKc3RkOjpzdHJpbmcgdWludHZhcl90b19kZWNpbWFsKCBjb25zdCBzdGQ6OnN0cmluZyYgdWludHZhciApCnsKICAgIGNvbnN0ZXhwciBzdGQ6OnNpemVfdCBNQVhfQklUUyA9IDY0IDsKICAgIGNvbnN0IHN0ZDo6c2l6ZV90IE5CWVRFUyA9IHN0ZDo6bWluKCB1aW50dmFyLnNpemUoKS8yLCBNQVhfQklUUy84ICkgOwoKICAgIHN0ZDo6c3RyaW5nIGJpdHMgOwoKICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDAgOyBpIDwgTkJZVEVTIDsgKytpICkgLy8gZm9yIGVhY2ggYnl0ZQogICAgICAgIGJpdHMgKz0gc2V2ZW5fYml0cyggdWludHZhci5zdWJzdHIoIGkqMiwgMiApICkgOyAvLyBhZGQgdGhlIDcgbHNiIHRvIGJpdHMKICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzdG0gOwogICAgc3RtIDw8IHN0ZDo6Yml0c2V0PE1BWF9CSVRTPihiaXRzKS50b191bGxvbmcoKSA7IC8vIGNvbnZlcnQgdG8gZGVjaW1hbCBudW1iZXIKICAgIHJldHVybiBzdG0uc3RyKCkgOwp9CgppbnQgbWFpbigpCnsKICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGJpdHMgPSAiMTExMTExMTEwMDAxMDAxMDAwMTEwMTAwMTAxMSIgOwogICAgc3RkOjpjb3V0IDw8IGJpbmFyeV90b19oZXgoYml0cykgPDwgJ1xuJyA7CgogICAgY29uc3Qgc3RkOjpzdHJpbmcgdWludHZhciA9ICI4YTVjIiA7CiAgICBzdGQ6OmNvdXQgPDwgdWludHZhcl90b19kZWNpbWFsKHVpbnR2YXIpIDw8ICdcbicgOwp9Cg==