C++ でビット操作メソッドを使用する
-
C++ で
union
をstruct
と組み合わせて使用して効率的なビット操作データ構造を実装する -
C++ で
std::bitset
を使用してビット操作操作を実行する - C++ でビット操作を使用して 2つの整数を交換する
この記事では、C++ でビット操作メソッドを使用する方法について説明します。
C++ で union
を struct
と組み合わせて使用して効率的なビット操作データ構造を実装する
ビット操作は、ビット演算子を使用して整数変数に対して実行される一般的な操作の広義の名前と見なすことができます。ビット単位のシフト演算子は、パフォーマンスを向上させながら、数値の一般的な算術演算を置き換えるためによく使用されます。整数型は、特定の型の個別のビットセットにさまざまな情報を格納することにより、複合データ構造を実装するために一般的に使用されることに注意してください。この方法は、データのメモリフットプリントを最小限に抑え、アクセス速度を向上させるために使用できます。
この場合、union
および struct
キーワードを使用して、32 ビットを格納できる uint32_t
型整数を格納するための BitSet
という名前の特別なオブジェクトを実装します。union
は、複数のデータメンバーを持つことができる C++ の特別な種類のクラスを定義しますが、常に有効な値を格納できるのはそのうちの 1つだけです。その結果、クラスオブジェクトは通常、最大のデータメンバーの量を占めます。次の例は、ビットフィールドの使用法も示しており、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
C++ で std::bitset
を使用してビット操作操作を実行する
std::bitset
は C++ 標準ライブラリの一部であり、固定サイズのビットシーケンスを表します。これは、ビットマスクを使用した整数型の生の操作よりも簡単に利用できる直感的なコンストラクターとビット修飾子/アクセス関数を提供します。std::bitset
はすべてのビット演算子をサポートし、同様のオブジェクトを比較します。次のコードスニペットは、std::bitset
オブジェクトの基本的な操作の一部を示しています。
#include <bitset>
#include <iostream>
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++ でビット操作を使用して 2つの整数を交換する
算術演算とは別に、一部のビット演算子は、多くの一般的なプログラミング問題を解決する便利な機能を提供します。そのような例の 1つは、XOR ビット演算子を使用して 2つの整数変数を交換することです。XOR スワップは、一時変数を使用した通常のスワップよりも優れたパフォーマンスを保証するものではなく、最新のデスクトップおよびモバイルアプリケーションプロセッサではさらに遅くなる可能性があることに注意してください。
#include <bitset>
#include <iostream>
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