zoukankan      html  css  js  c++  java
  • C++ 的位运算:__builtin, bitset

    • int __builtin_ffs (unsigned int x)
      返回二进制表示中 x 的最后一位 (1)(最右边的)是从后向前第几位,比如 (7368(1110011001000)) 返回 (4)
    • int __builtin_clz (unsigned int x)
      返回二进制表示中前导 (0) 的个数。
    • int __builtin_ctz (unsigned int x)
      返回二进制表示中末尾 (0) 的个数。
    • int __builtin_popcount (unsigned int x)
      返回二进制表示中 (1) 的个数。
    • int __builtin_parity (unsigned int x)
      返回 x 的奇偶校验位,也就是 x(1) 的个数模 (2) 的结果。

    这些函数都有相应的 unsigned longunsigned long long 版本,只需在函数名后面加上 lll 即可,如 int __builtin_clzll


    bitset 定义在 <bitset> 库中。

      bitset<8> b1; // [0,0,0,0,0,0,0,0]
      bitset<8> b2(42);          // [0,0,1,0,1,0,1,0]
      bitset<17> bs(0xfff0);      // [1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0]
      string bit_string = "110010";
      bitset<8> b3(bit_string);       // [0,0,1,1,0,0,1,0]
      bitset<8> b4("110010");       // [0,0,1,1,0,0,1,0]
    
      cout << b4[0] << b4[1] << b4[2] << b4[3] << b4[4] << endl; // 0,1,0,0,1
      cout << b3 << endl; // 00110010 (1. 不是 50! 2. 会输出前导 0! )
    
      b4[0] = true; // b4 = [0,0,1,1,0,0,1,1]
      b4.set(3);    //      [0,0,1,1,1,0,1,1]
      b4.set(5);    //      [0,0,1,1,1,0,1,1] , 并没有变化
      b4.unset(4);  //      [0,0,1,0,1,0,1,1]
      b4.flip(1);   //      [0,0,1,0,1,0,0,1]
      b4.flip(1);   //      [0,0,1,0,1,0,1,1]
      b4.flip(2);   //      [0,0,1,0,1,1,1,1]
      b4.flip(0);   //      [0,0,1,0,1,1,1,0]
    
      cout << b2.size() << ',' << bs.size << endl;// 8,17
      cout << b2.count() << endl;// 3
      cout << bs.count() << endl;// 13
    
      string
    

    另外,bitset 支持类似一个整数的操作,可以比较相等还是不等(但不能比较谁大谁小),可以左移右移,可以按位取与或非异或。但是一个 bitset 不能和一个真正的整数(如 int 型整数)进行这些操作

  • 相关阅读:
    Best code水题之路
    我的CodeF水A题之路
    studing(来自转载)
    BFS
    fibonacci数列(五种)
    Redis阻塞队列原理学习
    the enum hack
    Divide Two Integers
    Surrounded Regions
    Search in Rotated Sorted Array
  • 原文地址:https://www.cnblogs.com/P6174/p/8759249.html
Copyright © 2011-2022 走看看