以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 qY\f'K}Q*
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 -
0?^#G}3}
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 p ?wI9GY
象当作char数组来处理。 '`1CBU$
template<class Container> (98Nzgxgx}
class bit_iterator : public std::iterator<bidirectional_iterator_tag, :eo
void, void> CK,
6ytB
{ {'16:dTJ
public: '!f5?O+E
explicit bit_iterator(Container& c) : m_container(&c) R |KD&!~Z
{ 9&RFO$WH
m_size = 8*sizeof(Container); 29XL$v],
m_index = 0; ?FfC
} wP"dZagpj
explicit bit_iterator() : m_container(0) Qr
Wj>uR
{ K't]n{$
m_size = 8*sizeof(Container); bQ|V!mrN}
m_index = m_size; 1s1=rZ!
} 5U_H>oD
bool operator* () 5Sk W-+$
{ 5>AX*]c
char mask = 1; T{wuj[Q#:
char* pc = (char*)m_container; u&wiGwF[
int i = (m_size-m_index-1)/8; j5@:a
int off = (m_size-m_index-1)%8; K'#E3={tt
mask <<=off; +H$!a
return pc & mask; =IAsH85Q
} qY 4#V k
bit_iterator<Container>& operator++() $=?@*p
{ [pVamE
m_index++; /c):}PJ^#7
return *this; 4Jx"A\5*G
} PqM1aoyX
bit_iterator<Container>& operator++(int) )}9rwZ
{ <3,<\ub
m_index++; h$L"8#
return *this; RmZ]"
`
} mDZ*E !B
bool operator==(bit_iterator<Container>& bitIt) a1Qv@p^._b
{ xeGb?DPu
return m_index == bitIt.m_index; \c^45<G2qA
} y^o@"IYu3
bool operator!=(bit_iterator<Container>& bitIt) v9T_&
{ I@\OaUGr+
return !(*this == bitIt); BC'llD
} s`>[F@N7.o
protected: [5Lz/ix=
Container* m_container; 9P{;HusNw
private: ?ve#} \
int m_size; {\[5}nV
int m_index; G\TfL^A
}; ^]
kF{
o?
WOh|U4vt
用该迭代器可以将任意类型对象以二进制格式输出: )&
u5IA(
double a = 10; -(K9s!C!.
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));