C++ でビット操作メソッドを使用する

胡金庫 2023年10月12日
  1. C++ で unionstruct と組み合わせて使用して効率的なビット操作データ構造を実装する
  2. C++ で std::bitset を使用してビット操作操作を実行する
  3. C++ でビット操作を使用して 2つの整数を交換する
C++ でビット操作メソッドを使用する

この記事では、C++ でビット操作メソッドを使用する方法について説明します。

C++ で unionstruct と組み合わせて使用して効率的なビット操作データ構造を実装する

ビット操作は、ビット演算子を使用して整数変数に対して実行される一般的な操作の広義の名前と見なすことができます。ビット単位のシフト演算子は、パフォーマンスを向上させながら、数値の一般的な算術演算を置き換えるためによく使用されます。整数型は、特定の型の個別のビットセットにさまざまな情報を格納することにより、複合データ構造を実装するために一般的に使用されることに注意してください。この方法は、データのメモリフットプリントを最小限に抑え、アクセス速度を向上させるために使用できます。

この場合、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
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook