#include <iostream>
#include <algorithm>
#include <bitset>
std::uint64_t key_reg(std::uint8_t* bytes, std::size_t pos, std::size_t n)
{
std::uint64_t reg = 0;
auto start = bytes + pos / 8;
auto end = bytes + n / 8 + ( n % 8 != 0 );
std::reverse_copy( start, end, reinterpret_cast<char *>( ® ) );
reg >>= ( n + pos ) % 8;
reg &= ~( -1UL << n );
return reg;
}
int main()
{
std::uint8_t bt1[] = {255, 0, 255};
std::cout << std::bitset<64>( key_reg( bt1, 2, 15 ) ).to_string() << std::endl;
std::uint8_t bt2[] = {7, 128, 7};
std::cout << std::bitset<64>( key_reg( bt2, 2, 9 ) ).to_string() << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8Yml0c2V0PgoKc3RkOjp1aW50NjRfdCBrZXlfcmVnKHN0ZDo6dWludDhfdCogYnl0ZXMsIHN0ZDo6c2l6ZV90IHBvcywgc3RkOjpzaXplX3QgbikKewogICBzdGQ6OnVpbnQ2NF90IHJlZyA9IDA7CiAgIGF1dG8gc3RhcnQgPSBieXRlcyArIHBvcyAvIDg7CiAgIGF1dG8gZW5kID0gYnl0ZXMgKyBuIC8gOCArICggbiAlIDggIT0gMCApOwogICBzdGQ6OnJldmVyc2VfY29weSggc3RhcnQsICBlbmQsIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciAqPiggJnJlZyApICk7CiAgIHJlZyA+Pj0gKCBuICsgcG9zICkgJSA4OwogICByZWcgJj0gfiggLTFVTCA8PCBuICk7CiAgIHJldHVybiByZWc7Cn0KCmludCBtYWluKCkKewogICAgc3RkOjp1aW50OF90IGJ0MVtdID0gezI1NSwgMCwgMjU1fTsKICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmJpdHNldDw2ND4oIGtleV9yZWcoIGJ0MSwgMiwgMTUgKSApLnRvX3N0cmluZygpIDw8IHN0ZDo6ZW5kbDsKICAgIHN0ZDo6dWludDhfdCBidDJbXSA9IHs3LCAxMjgsIDd9OwogICAgc3RkOjpjb3V0IDw8IHN0ZDo6Yml0c2V0PDY0Pigga2V5X3JlZyggYnQyLCAyLCA5ICkgKS50b19zdHJpbmcoKSA8PCBzdGQ6OmVuZGw7Cn0=