【问题标题】:Convert bool array to int32 ,unsigned int and double?将 bool 数组转换为 int32、unsigned int 和 double?
【发布时间】:2015-12-01 07:52:36
【问题描述】:

我有大小为 32、48、64 的 bool 数组(每个布尔值代表一个位)。如何将它们转换为性能良好的数字(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

【问题讨论】:

  • convert 到底是什么意思?对于整数,所有位都可以从循环中移入,但我不确定你想要的双精度值。它们的位表示是在编译器中定义的实现。

标签: c++ algorithm data-conversion boolean-operations


【解决方案1】:
#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

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      【解决方案3】:

      O(n):

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-19
        • 1970-01-01
        • 2015-06-12
        • 2013-05-16
        • 1970-01-01
        • 2012-09-28
        • 1970-01-01
        • 2011-05-25
        相关资源
        最近更新 更多