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 long
和 unsigned long long
版本,只需在函数名后面加上 l
或 ll
即可,如 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 型整数)进行这些操作。
来源:https://www.cnblogs.com/P6174/p/8759249.html