以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 +nQw?'9Z
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 r!,}Z=cGe
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 si4don
象当作char数组来处理。 0j C3fT!n
template<class Container> #M A4
class bit_iterator : public std::iterator<bidirectional_iterator_tag, m[k_>e\u
void, void> jF[ 1za
{ wp7!>%s{
public: ]:34kE}e5
explicit bit_iterator(Container& c) : m_container(&c) )*c>|7G
{ JF/,K"J
m_size = 8*sizeof(Container); M@W[Bz
m_index = 0; j5I`a 1j`
} 6=N`wi
explicit bit_iterator() : m_container(0) ^*\XgX
{ -[L!3jU
m_size = 8*sizeof(Container); F7")]q3I~
m_index = m_size; } G<rt
} <LRey%{q
bool operator* () X>?b#Eva
{ ^T~gEv
char mask = 1; ?uMQP NYs
char* pc = (char*)m_container; _20#2i&
int i = (m_size-m_index-1)/8; $)H@|<K
int off = (m_size-m_index-1)%8; }h 3K@R
mask <<=off; L,;D@Xi
return pc & mask; RmrL^asg
} 21RP=0Q:
bit_iterator<Container>& operator++() Ej7 /X ~
{ -YD+(c`l
m_index++; /*Qq[C
return *this; ?|e'Gbb_
} mZIoaF>t
bit_iterator<Container>& operator++(int) e?bYjJq
{ P,=+W(s9}
m_index++; ~XeFOMq
return *this; )bx_;9Y{
}
'8j$';&`
bool operator==(bit_iterator<Container>& bitIt) ny-7P;->8
{ $;G{Pyp
return m_index == bitIt.m_index; Vx_rc%'
} zY+Fl~$S
bool operator!=(bit_iterator<Container>& bitIt) {K#NB_*To
{ '&;yT[
return !(*this == bitIt); 6mH/ m&
} VDB;%U*D
protected: v}^5Rp&m
Container* m_container; .yENM[-bQ
private:
_if|TFw;h
int m_size; e4OeoQ@ >
int m_index; ZDL']*)'
}; $>U#
W:
x( mE<UQN
用该迭代器可以将任意类型对象以二进制格式输出: ^% Q|s#w.
double a = 10; g/=K.
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));