码迷,mamicode.com
首页 > 编程语言 > 详细

C++ 的位运算:__builtin, bitset

时间:2018-04-09 15:10:34      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:count()   返回   版本   span   cout   zll   c++   没有   校验   

  • 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

标签:count()   返回   版本   span   cout   zll   c++   没有   校验   

原文地址:https://www.cnblogs.com/P6174/p/8759249.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!