1. 程式人生 > >C++ 的位運算:__builtin, bitset

C++ 的位運算:__builtin, bitset

函數 運算 校驗位 end 奇偶校驗位 HR IT strong 與或非

  • 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; // 110010 (不是 50!)

  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 型整數)進行這些操作

C++ 的位運算:__builtin, bitset