代码之家  ›  专栏  ›  技术社区  ›  bobber205

将整数转换为位表示形式

  •  13
  • bobber205  · 技术社区  · 16 年前

    如何将整数转换为其位表示形式。我想取一个整数并返回一个向量,该向量包含整数位表示的1和0。

    我有一段很长的时间试图自己做这个,所以我想我会问是否有一个内置的库函数可以帮助。

    6 回复  |  直到 10 年前
        1
  •  15
  •   dcp    16 年前

    不适用于底片。

    vector<int> convert(int x) {
      vector<int> ret;
      while(x) {
        if (x&1)
          ret.push_back(1);
        else
          ret.push_back(0);
        x>>=1;  
      }
      reverse(ret.begin(),ret.end());
      return ret;
    }
    
        2
  •  6
  •   Potatoswatter    16 年前

    用一行程序来解决并不难,但实际上有一个标准的库解决方案。

    #include <bitset>
    #include <algorithm>
    
    std::vector< int > get_bits( unsigned long x ) {
        std::string chars( std::bitset< sizeof(long) * CHAR_BIT >( x )
            .to_string< char, std::char_traits<char>, std::allocator<char> >() );
        std::transform( chars.begin(), chars.end(),
            std::bind2nd( std::minus<char>(), '0' ) );
        return std::vector< int >( chars.begin(), chars.end() );
    }
    

    C++0X甚至更容易!

    #include <bitset>
    
    std::vector< int > get_bits( unsigned long x ) {
        std::string chars( std::bitset< sizeof(long) * CHAR_BIT >( x )
            .to_string( char(0), char(1) ) );
        return std::vector< int >( chars.begin(), chars.end() );
    }
    

    这是图书馆里比较奇怪的角落之一。也许他们真正想要的是序列化。

    cout << bitset< 8 >( x ) << endl; // print 8 low-order bits of x
    
        3
  •  3
  •   Dennis Zickefoose    16 年前

    DCP答案的修改。行为是为t的负值定义的实现。它提供所有位,甚至前导零。与使用 std::vector<bool> 它不是一个合适的容器。

    #include <vector>    //for std::vector
    #include <algorithm> //for std::reverse
    #include <climits>   //for CHAR_BIT
    
    template<typename T>
    std::vector<bool> convert(T t) {
      std::vector<bool> ret;
      for(unsigned int i = 0; i < sizeof(T) * CHAR_BIT; ++i, t >>= 1)
        ret.push_back(t & 1);
      std::reverse(ret.begin(), ret.end());
      return ret;
    }
    

    以及一个可以处理浮点值的版本。可能还有其他的豆荚。我根本没有测试过这个。对于负值,它可能更有效,或者更糟。我没怎么想。

    template<typename T>
    std::vector<bool> convert(T t) {
      union {
        T obj;
        unsigned char bytes[sizeof(T)];
      } uT;
      uT.obj = t;
    
      std::vector<bool> ret;
      for(int i = sizeof(T)-1; i >= 0; --i) 
        for(unsigned int j = 0; j < CHAR_BIT; ++j, uT.bytes[i] >>= 1)
          ret.push_back(uT.bytes[i] & 1);
      std::reverse(ret.begin(), ret.end());
      return ret;
    }
    
        4
  •  2
  •   maerics    16 年前

    下面是一个使用负数的版本:

    string get_bits(unsigned int x)
    {
      string ret;
      for (unsigned int mask=0x80000000; mask; mask>>=1) {
        ret += (x & mask) ? "1" : "0";
      }
      return ret;
    }
    

    当然,字符串可以用向量替换,或者索引位值。

        5
  •  1
  •   jweyrich    16 年前

    返回字符串而不是向量,但可以轻松更改。

    template<typename T>
    std::string get_bits(T value) {
        int size = sizeof(value) * CHAR_BIT;
        std::string ret;
        ret.reserve(size);
        for (int i = size-1; i >= 0; --i)
            ret += (value & (1 << i)) == 0 ? '0' : '1';
        return ret;
    }
    
        6
  •  0
  •   MSN    16 年前

    世界上最差的整数到位字节转换器:

    #include <algorithm>
    #include <functional>
    #include <iterator>
    #include <stdlib.h>
    
    class zero_ascii_iterator: public std::iterator<std::input_iterator_tag, char>
    {
    public:
        zero_ascii_iterator &operator++()
        {
            return *this;
        }
    
        char operator *() const
        {
            return '0';
        }
    };
    
    
    char bits[33];
    
    _itoa(value, bits, 2);
    std::transform(
        bits, 
        bits + strlen(bits), 
        zero_ascii_iterator(), 
        bits, 
        std::minus<char>());