#include <iostream>
#include <bitset>
#include <climits>
enum class endianness : bool { big, little };
constexpr endianness getEndianness()
{
uint32_t word = 1;
uint8_t* byte = (uint8_t*)& word;
if(byte[0])
return endianness::little;
else
return endianness::big;
}
constexpr bool isLittleEndian()
{
switch(getEndianness())
{
case endianness::little:
return true;
case endianness::big:
return false;
}
}
auto make_bitSet (bool flags[], size_t size)
{
std::bitset< 8*sizeof(ULLONG_MAX) > bitSet;
if( isLittleEndian() )
for (size_t i = 0; i < size; ++i)
bitSet.set( i, flags[size-i-1] );
else
for (size_t i = 0; i < size; ++i)
bitSet.set( i, flags[i] );
return bitSet.to_ullong();
}
int main (int, char**)
{
bool ar1[] = {1, 0, 1, 0 };
bool ar2[] = {1, 0, 1, 0, 1, 1, 0, 0};
bool ar3[] = {1, 0, 1, 0, 1, 1, 0, 0,
1, 0, 1, 0, 1, 1, 0, 0};
bool ar4[] = {1, 0, 1, 0, 1, 1, 0, 0,
1, 0, 1, 0, 1, 1, 0, 0,
1, 0, 1, 0, 1, 1, 0, 0,
1, 0, 1, 0, 1, 1, 0, 0,
1, 0, 1, 0, 1, 1, 0, 0,
1, 0, 1, 0, 1, 1, 0, 0};
bool ar5[] = {1, 0, 1, 0, 1, 1, 0, 0,
1, 0, 1, 0, 1, 1, 0, 0,
1, 0, 1, 0, 1, 1, 0, 0,
1, 0, 1, 0, 1, 1, 0, 0,
1, 0, 1, 0, 1, 1, 0, 0,
1, 0, 1, 0, 1, 1, 0, 0,
1, 0, 1, 0, 1, 1, 0, 0,
1, 0, 1, 0, 1, 1, 0, 0};
std::cout << make_bitSet(ar1, 4) << '\n';
std::cout << make_bitSet(ar2, 8) << '\n';
std::cout << make_bitSet(ar3, 16) << '\n';
std::cout << make_bitSet(ar4, 48) << '\n';
std::cout << make_bitSet(ar5, 64) << std::endl;
return 0;
}
cout
10
172
44204
189857631349932
12442509728149187756