C++ 的位运算:__builtin, bitset

风流意气都作罢 提交于 2020-03-08 10:07:54
  • 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 型整数)进行这些操作

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!