スポンサーリンク

unsigned charにビット単位でアクセスするクラス

1bit単位の処理が必要になったので、charの各ビットに[]でアクセスできるクラスを書いた。

今見たら、クラス名iteratorはおかしい。まあいいか。

プログラム本体

#include <iostream>
#include <bitset>


//! @brief 1ビットにoperator=を提供するためのクラス
class bititerator_t {
  unsigned char* m_c;
  int m_index;
public:
  bititerator_t(unsigned char* c, const int index) {
    m_c = c;
    m_index = 7-index;
  }
  void operator=(const int value) {
    unsigned char mask = (1 << m_index);

    if (value) {
      *m_c |= mask;
    }
    else {
      *m_c &= ~mask;
    }
  }
  operator unsigned char() {
    unsigned char mask = (1 << m_index);

    return (*m_c & mask) ? 1 : 0;
  }
};
//! @brief ビットを配列のようにアクセスするクラス
class BitArray {
  unsigned char c;
public:
  BitArray() :c(0) {}

  //! @brief 各ビットへ[]でアクセスする
  bititerator_t operator[](const int i) {
    return bititerator_t(&c, i);
  }
  operator unsigned char(){
    return c;
  }

  //内部のunsigned charデータへ書き込む
  unsigned char operator=(const unsigned char value) {
    c = value;
    return c;
  }
};
int main()
{

  BitArray bit;

  bit[0] = 1;
  bit[1] = 0;
  bit[2] = 1;
  bit[3] = 1;
  bit[4] = 0;
  bit[5] = 0;
  bit[6] = 0;
  bit[7] = 0;

  std::cout << (unsigned int)bit << " " << std::bitset<8>(bit) << std::endl;

  int i;
  std::cin >> i;

}

結果

176 10110000

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: