📜  C++位集有趣的事实

📅  最后修改于: 2021-05-25 23:49:06             🧑  作者: Mango

位集是C++标准模板库中的一个容器,用于在位级别处理数据。

  1. 一个位集存储位(只有两个可能值的元素:0或1)。但是,我们可以通过向bitset构造函数提供位置来获取字符串的一部分(位置是相对于字符串位置的从左到右)

    例子:

    // C++ program to demonstrate that we can get part of a 
    // bit string in bitset.
    #include 
    #include 
    #include 
      
    int main()
    {
      std::string bit_string = "110010";
      std::bitset<8> b1(bit_string);             // [0, 0, 1, 1, 0, 0, 1, 0]
      
      // string from position 2 till end
      std::bitset<8> b2(bit_string, 2);      // [0, 0, 0, 0, 0, 0, 1, 0]
      
      // string from position 2 till next 3 positions
      std::bitset<8> b3(bit_string, 2, 3);   // [0, 0, 0, 0, 0, 0, 0, 1]
        
      std::cout << b1 << '\n' << b2 << '\n' << b3 << '\n';
      
      return 0;
    } 
    

    输出:

    00110010
    00000010
    00000001
    
  2. 我们可以使用std :: basic_string _str中的字符构造一个位集。可以提供可选的起始位置_pos和长度_n,以及表示设置(_one)和未设置(_zero)位的备用值的字符。
    句法:
    std::bitset b1(str, pos, n, zero, one);
    str    : string used to initialize the bitset
    pos    : a starting offset into str
    n    : number of characters to use from str
    zero    : alternate character for unset bits in str
    one    : alternate chracters for set bits in str 
    
    • 如果_pos> str.size(),则此构造方法将抛出std :: out_of_range。
    • 如果在_str中检查的任何字符不为零或一,则将引发std :: invalid_argument。
    // C++ program to demonstrate that we can construct bitset using
    // alternate characters for set and unset bits.
    #include 
    #include 
    #include 
      
    int main() 
    {
        // string constructor using custom zero/one digits
        std::string alpha_bit_string = "aBaaBBaB";
        std::bitset<8> b1(alpha_bit_string, 0, alpha_bit_string.size(),
                          'a', 'B');         // [0,1,0,0,1,1,0,1]
      
        std::cout << b1 << '\n';
    }
    

    输出:

    01001101
    
  3. 构造类位集的目的,初始化n位的值对应于在零和一的C语言风格的所提供的字符。您可以在不将字符串转换为字符串类型的情况下调用构造函数。它还具有两个可选参数_Zero和_One,它们指示_Str中的哪个字符分别解释为0位和1位。
    #include 
    #include 
      
    int main() 
    {
        // char* constructor using custom digits
        std::bitset<8> b1("XXXXYYYY", 8, 'X', 'Y'); // [0, 0, 0, 0, 1, 1, 1, 1]
        std::cout << b1 << '\n';
    }
    

    输出:

    00001111
    

    位集操作

    1. std :: bitset :: to_string()
      将位集的内容转换为字符串。使用0表示值为false的位和使用1表示值为true的位。结果字符串包含N个字符,第一个字符对应于最后(N-1)位,而最后一个字符对应于第一位。同样,我们可以通过参数传递用于打印真假值的字符。

      例子:

      // C++ program to demonstrate that we can convert contents
      // of bitset to a string.
      #include 
      #include 
        
      int main()
      {
          std::bitset<8> b(42);
          std::cout << b.to_string() << '\n'
                    << b.to_string('*') << '\n'
                    << b.to_string('O', 'X') << '\n';
      }
      

      输出:

      00101010
      **1*1*1*
      OOXOXOXO
      
    2. std :: bitset :: to_ulong():
    3. 将位集的内容转换为无符号的长整数。比特集的第一位对应于该数字的最低有效位,而最后一位对应于该最高有效位。如果该值不能以无符号长表示,则函数引发std :: overflow_error。

      例子:

      // C++ program to demonstrate that we can get value of bitset
      // as  unsigned long integer.
      #include 
      #include 
         
      int main()
      {
          std::bitset<5> b(5);
          std::cout << b.to_ulong() << '\n'; 
      }
      

      输出:

      5
      
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”