以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 }BL7P-km
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 zb"4_L@m2
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 PeqW+Q.
象当作char数组来处理。 I_Gz~ qk6
template<class Container> mD&I6F[s
class bit_iterator : public std::iterator<bidirectional_iterator_tag, %eIaH!x:
void, void> wF% RM$
{ fc<y(uX
public: 3"v>y]$U
explicit bit_iterator(Container& c) : m_container(&c) ']I!1>v$[
{ o~\.jQQxa
m_size = 8*sizeof(Container); _-543B}
m_index = 0; p[].4_B;
} }mIN)o
explicit bit_iterator() : m_container(0) &IzNoB
{ w3sU& |N
m_size = 8*sizeof(Container); aBG^Xhx
m_index = m_size; *x]*%
} ~x<?Pj
bool operator* () xLi3|^q
{ X/vyb^:U
char mask = 1; $\/^O94-l
char* pc = (char*)m_container; JN` $Fq+
int i = (m_size-m_index-1)/8; HQ7g0:-^a>
int off = (m_size-m_index-1)%8; |mHf7gCX
mask <<=off; oD\t4]?E
return pc & mask; 2Vf242z_
} yTK3eK
bit_iterator<Container>& operator++() cqJXZ.XC
{ gC iM\Qx
m_index++; 1jop;{,^
return *this; }
S]!W\a
} jn(!6\n"
bit_iterator<Container>& operator++(int) $cJ fdE
{ YaC[S^p
m_index++; <DR!AR)
return *this; _Y]Oloo('
} Cojs;`3iF:
bool operator==(bit_iterator<Container>& bitIt) t^zE^:06
{ :3
Hz!iZM
return m_index == bitIt.m_index; 2PRiiL@
} >JsVIfAF
bool operator!=(bit_iterator<Container>& bitIt) Z}\,rex
{ 6S_mfWsi
return !(*this == bitIt); 3c,4 wyn
} (Sgsy^|N
protected: tD}-&"REP
Container* m_container; 0!ZaR6
private: `O0Qtq.
int m_size; c^pQitPv
int m_index; "Ueq
}; 9*K-d'm
a@|H6:|
用该迭代器可以将任意类型对象以二进制格式输出: ob2_=hQnC
double a = 10; 6D2ot&5WW
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));