以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 Y1{*AV6ev6
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 -}H
EV#ev
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 =~k#<q1^
象当作char数组来处理。 TO]
cZZ<
template<class Container> j[fY.>yt&
class bit_iterator : public std::iterator<bidirectional_iterator_tag, qa?0GTAS
void, void> V24FzQ?z:.
{ ]sB%j@G
public: d{]2Q9g
explicit bit_iterator(Container& c) : m_container(&c) r+i=P_p
{ &^B;1ZMHD
m_size = 8*sizeof(Container); Dq*O8*#*
m_index = 0; (;++a9GK
} ^'hh?mL
explicit bit_iterator() : m_container(0) *1U"uJno
{ D<bHRtP
m_size = 8*sizeof(Container); l9{.~]V
m_index = m_size; G"*ch$:
} YH0utc
bool operator* () Ve[&_(fP
{ -8Uz8//A
char mask = 1; }FC(Z-g
char* pc = (char*)m_container; M#SGZ~=1r
int i = (m_size-m_index-1)/8; :g)`V4%
int off = (m_size-m_index-1)%8; VyOpPIP
mask <<=off; z?C&,mv
return pc & mask; ?T8^tGD[
} 5?Rzyfwk|
bit_iterator<Container>& operator++() V<t!gT#&o!
{ SD1M`PI
m_index++; a]?o"{{+
return *this; 'w`9lIax
} #AH<dS
bit_iterator<Container>& operator++(int) p+xjYU4^C
{ 7)l+hZ
m_index++; "jP{m;p
return *this; =XZd_v
} `4t*H>:y
bool operator==(bit_iterator<Container>& bitIt) 5uL!Ae
{ $1bzsB|^
return m_index == bitIt.m_index; 0M;aTM
} }r;#|=HR
bool operator!=(bit_iterator<Container>& bitIt) WCwM+D
{ V7,;N@FL
return !(*this == bitIt); Uk0
0lPG.U
} ,V ) |A=ml
protected: $Rf)i W;h
Container* m_container; B3@\Ua)
private: #Dl=K<I
int m_size; N=TDywRI
int m_index; QfI@=Kbg%#
}; HD8*>p.
Rj])c^ZA'*
用该迭代器可以将任意类型对象以二进制格式输出: b("M8}o
double a = 10; 7\EY&KI"0
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));