以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 fmnRUN=
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 n=G>y7b
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 BK(pJNBh
象当作char数组来处理。 c3zT(FgO>N
template<class Container> xS~yH[k
class bit_iterator : public std::iterator<bidirectional_iterator_tag, mI7rx`4H
void, void> s-GleX<
{ b#p~F}qT
public: rKzv8d
explicit bit_iterator(Container& c) : m_container(&c) ayH%
qp
{ !$p2z_n$@.
m_size = 8*sizeof(Container); T$n>7X-r
m_index = 0; P 34LV+e
} xxLgC;>[
explicit bit_iterator() : m_container(0) _b!;(~@p
{ CRc!|?
m_size = 8*sizeof(Container); 6VH90KAT
m_index = m_size; f/0v'
Jt
} e7XsyL'|p
bool operator* () |D;"D
{ ZSF=
char mask = 1; Q(=Vk~v
char* pc = (char*)m_container; m~Y'$3w
int i = (m_size-m_index-1)/8; ' 1P=^
int off = (m_size-m_index-1)%8; ZVdsxo<
mask <<=off; .7pGx*WH^Y
return pc & mask; Q{qj
} `z-H]fU
bit_iterator<Container>& operator++() P~Te+ -jX}
{
NVO9XK
m_index++; Jt-XmGULB
return *this; oh7#cFZZ0
} {t844La"
bit_iterator<Container>& operator++(int) bmj8WZ
{ I~p8#<4#b
m_index++; _.d}lK3$2
return *this; \3H<z@;
} NJ|NJp&0
bool operator==(bit_iterator<Container>& bitIt) ;Cr_NP[8|j
{ cg(QjH"
return m_index == bitIt.m_index; L.09\1?.n
} f
MY;
bool operator!=(bit_iterator<Container>& bitIt) >a&