Преобразовать массив bool в int32, unsigned int и double?

У меня есть массивы bool размеров: 32, 48, 64 (каждый логический представляет немного). как я могу преобразовать их в число с хорошей производительностью (int, unsigned int, double48, double64)?
например :

bool ar[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1}
int num = bitArrayToInt32(ar,32);// num = 65

0

Решение

На):

int bitArrayToInt32(bool arr[], int count)
{
int ret = 0;
int tmp;
for (int i = 0; i < count; i++) {
tmp = arr[i];
ret |= tmp << (count - i - 1);
}
return ret;
}

int main()
{
bool ar[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1};
int num = bitArrayToInt32(ar,32);
printf("number = %d\n", num);
}
1

Другие решения

template <typename T>
T make_number (bool ar[], size_t ar_size) {
T ret {};

for (size_t i = 0; i < ar_size; ++i) {
T s {ar[i]};
s <<= i;
ret |= s;
}

return ret;
}int main (int, char**) {bool ar1[] = {1, 1, 1, 1, 0, 1};
bool ar2[] = {1, 1, 1, 1, 1, 1, 1, 1};
bool ar3[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0};
bool ar4[] = {1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1};

cout << static_cast<int> (make_number<char> (ar1, 6)) << endl;
cout << static_cast<int> (make_number<unsigned char> (ar2, 8)) << endl;
cout << make_number<short> (ar3, 16) << endl;
cout << make_number<uint64_t> (ar4, 64) << endl;

return 0;
}

И вывод:

47
255
32767
18446744073709551615
0

#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;
}

соиЬ

10
172
44204
189857631349932
12442509728149187756
0