以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 Uvc$&j^k
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。
*BM#fe
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 "?aI
象当作char数组来处理。 &{<hY|%
template<class Container> UNiK6h_%
class bit_iterator : public std::iterator<bidirectional_iterator_tag, T_UJ?W
void, void> n^|xp;] :
{ l/nBin&YGv
public: zvq}7,
explicit bit_iterator(Container& c) : m_container(&c) 3ww\Z8UeK
{ jLMy27Cn
m_size = 8*sizeof(Container); McS]aJfrk
m_index = 0; DHeZi3&i
} k+"7hf=C|
explicit bit_iterator() : m_container(0) FF^h(Ea
{ WH39=)D%u
m_size = 8*sizeof(Container); VKYljY0#
m_index = m_size; 5+oY c-
} WW6-oQs_#*
bool operator* () $]};EI#
{ [$d]U.
char mask = 1; (b[=~Nh'
char* pc = (char*)m_container; 9__Q-J
int i = (m_size-m_index-1)/8; *}#HBZe(9
int off = (m_size-m_index-1)%8; ,38M6yD
mask <<=off; [ypE[
return pc & mask; gk?H@b*
} ,ZY\})`p
bit_iterator<Container>& operator++() +eH`mI0f
{ ?,v&
o>*
m_index++; |k]]dP|:'
return *this; #tsP
} r|u R!=*|?
bit_iterator<Container>& operator++(int) [hot,\+f
{ 7CF>cpw
m_index++; bw/mF5AsW
return *this; ]:2Ro:4Yv
} 9$9aBW
bool operator==(bit_iterator<Container>& bitIt) tzgaHN
{ GoX<d{
return m_index == bitIt.m_index; ALO/{:l(
} NPO!J^^
bool operator!=(bit_iterator<Container>& bitIt) rc>}3?o
{ h\Y~sm?!`
return !(*this == bitIt); 3"my!}03
} ZR|s]'
protected: />:$"+gKo
Container* m_container; j p~Tlomp
private: C{t}q*fG
5
int m_size; Df2$2VU
int m_index; ZR)M<