在 C++ 中使用位操作方法
本文將解釋如何在 C++ 中使用位操作方法。
使用 union
結合 struct
在 C++ 中實現高效的位運算元據結構
位操作可以被認為是對使用按位運算子對整數變數進行的常見操作的廣義名稱。按位移位運算子通常用於替代數字上的常見算術運算,同時提供更好的效能。請注意,整數型別通常用於通過在給定型別的單獨位集中儲存不同的資訊來實現複合資料結構。此方法可用於最小化資料的記憶體佔用並提高訪問速度。
在這種情況下,我們利用 union
和 struct
關鍵字來實現一個名為 BitSet
的特殊物件,用於儲存 uint32_t
型別的整數,可以儲存 32 位。請注意,union
在 C++ 中定義了一種特殊的類,它可以有多個資料成員,但在任何給定時間只有一個可以儲存有效值。因此,類物件通常佔用最大資料成員的數量。下面的示例還演示了位域的用法,使整數中的預定義位集可以使用 struct
成員表示法訪問。可以使用每個成員的常規賦值操作或使用位操作來操作生成的 BitSet
。
#include <iostream>
using std::cout;
using std::endl;
union BitSet{
struct {
uint32_t b1:8;
uint32_t b2:8;
uint32_t b3:8;
uint32_t b4:8;
};
uint32_t bb;
};
int main() {
BitSet set1 = {'a', 'b', 'c', 'd'};
cout << set1.b1 << " "
<< set1.b2 << " "
<< set1.b3 << " "
<< set1.b4 << endl;
set1.bb = 'a' | ('b' << 8) | ('c' << 16) | ('d' << 24);
cout << set1.b1 << " "
<< set1.b2 << " "
<< set1.b3 << " "
<< set1.b4 << endl;
return EXIT_SUCCESS;
}
輸出:
97 98 99 100
97 98 99 100
使用 std::bitset
在 C++ 中進行位操作
std::bitset
是 C++ 標準庫的一部分,表示固定大小的位序列。它提供了一個直觀的建構函式和位修飾符/訪問函式,比使用位掩碼對整數型別進行原始操作更容易使用。std::bitset
支援所有按位運算子並比較相似的物件。下一個程式碼片段演示了對 std::bitset
物件的一些基本操作。
#include <iostream>
#include <bitset>
using std::cout;
using std::endl;
int main() {
std::bitset<8> bs1("11001001");
std::bitset<8> bs2(~bs1);
cout << "bs1 : " << bs1 << endl;
cout << "bs2 : " << bs2 << endl;
cout << "bs1 XOR bs2: " << (bs1 ^ bs2) << endl;
cout << "bs1 reset : " << bs1.reset() << endl;
return EXIT_SUCCESS;
}
輸出:
bs1 : 11001001
bs2 : 00110110
bs1 XOR bs2: 11111111
bs1 reset : 00000000
在 C++ 中使用位操作交換兩個整數
除了算術運算之外,一些按位運算子還提供有用的功能來解決許多常見的程式設計問題。一個這樣的例子是使用 XOR 按位運算子交換兩個整數變數。請注意,XOR 交換並不能保證比使用臨時變數的常規交換更好的效能,並且在現代桌面和移動應用程式處理器上甚至可能更慢。
#include <iostream>
#include <bitset>
using std::cout;
using std::endl;
void SwapIntegers(int &x, int &y)
{
y = x ^ y;
x = x ^ y;
y = x ^ y;
}
int main() {
int k = 5;
int m = 9;
cout << "k: " << k << " m: " << m << endl;
SwapIntegers(k, m);
cout << "k: " << k << " m: " << m << endl;
return EXIT_SUCCESS;
}
輸出:
k: 5 m: 9
k: 9 m: 5
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn