Convert bool array to int32 ,unsigned int and double?

后端 未结 3 1454
甜味超标
甜味超标 2021-01-17 00:14

I\'ve bool arrays of sizes : 32, 48, 64 (each boolean represents a bit). how can I convert them to a number with a good performance( int, unsigned int, double48, double64)?

3条回答
  •  半阙折子戏
    2021-01-17 00:52

    #include 
    #include 
    #include 
    
    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
    

提交回复
热议问题