C++ 的位運算:__builtin, bitset
阿新 • • 發佈:2018-04-09
函數 運算 校驗位 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 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; // 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