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 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 型整数)进行这些操作。