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