以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 CN}0( 2n
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 [d-Y1
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 ^<uQ9p^B
象当作char数组来处理。 &Vu-*?
template<class Container> PfB9 .f{
class bit_iterator : public std::iterator<bidirectional_iterator_tag, QC&,C}t,
void, void> !4<A|$mQ
{ k*C[-5&#
public: *UXa.kT@
explicit bit_iterator(Container& c) : m_container(&c) `s3:Vsv4
{ !&`\MD>;~R
m_size = 8*sizeof(Container); l<<9H-O
m_index = 0; /[ft{:#&t
} z]LVq k
explicit bit_iterator() : m_container(0) hN\sC9a1
{ dTlEEgR
m_size = 8*sizeof(Container); jxt]Z3a ~0
m_index = m_size; CC'N"Xb
} {*r!oD!'
bool operator* () ~*+evAP
{ cS2]?zI
char mask = 1; LyR<cd$W
char* pc = (char*)m_container; A:(qF.Tm
int i = (m_size-m_index-1)/8; QFoCi&
int off = (m_size-m_index-1)%8; tA'5ufj*:
mask <<=off; .I $+
E
return pc & mask; Q`4Ia<5B
} }W[=O:p
bit_iterator<Container>& operator++() h|ib*%P_
{ 1jAuW~
m_index++; eNM"e-
return *this; =UWW(^M#[:
} {sj{3I u
bit_iterator<Container>& operator++(int) ) ]<^*b>
{ hJw]hVYa
m_index++; &OEBAtc/
return *this; ;B(16&l=q
} qV,x )y:V
bool operator==(bit_iterator<Container>& bitIt) "(kiMog-
{ E9t8SclV
return m_index == bitIt.m_index; "Vp:Sq9y
} l8_RA
bool operator!=(bit_iterator<Container>& bitIt) fA[T5<66
{ :Z_abKt
return !(*this == bitIt); Ir*{IVvej
} (v:8p!QN
protected: C7}iwklcsa
Container* m_container;
klY, @
private: twK 3
int m_size; RyM29uD
int m_index; IjQgmS~G
}; FL&Y/5
=^l`c$G<
用该迭代器可以将任意类型对象以二进制格式输出: D~`RLPMk
double a = 10; x") Bmw$
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));