以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 R8":1 #&
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 tkNuM0
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 qDcl;{L
象当作char数组来处理。 z^Oiwzo
template<class Container> 3b%y+?-{\u
class bit_iterator : public std::iterator<bidirectional_iterator_tag, 8&dmH&
void, void> #H7(d T
{ QbOmJQ
public: ;=B&t@
explicit bit_iterator(Container& c) : m_container(&c) 9;h1;9sC|
{ ^0X86
m_size = 8*sizeof(Container); pjbKMx
m_index = 0; fFSW\4JD=
} !H?#~{
W}
explicit bit_iterator() : m_container(0) 9H.E15B
{ 5%tIAbGW
m_size = 8*sizeof(Container);
;h
m_index = m_size; .>CqZN,^
} wond>m
3
bool operator* () E37`g}ZS
{ 8V~w3ssz
char mask = 1; 9RR1$( f
char* pc = (char*)m_container; 3ck;~Ncj<
int i = (m_size-m_index-1)/8; YW/YeID
int off = (m_size-m_index-1)%8; +yCIA\i#t6
mask <<=off; oleRQ=
return pc & mask; n%"s_W'E
} z
KJ6j ]m
bit_iterator<Container>& operator++() %li'j|
{ o
@*3<_e
m_index++; nM}X1^PiK"
return *this; tQ=U22&7
} V3I&0P k
bit_iterator<Container>& operator++(int) B8w0DJ
{ qx`*]lX
m_index++; W0gaOew(^
return *this; S'TF7u
} ,h> 0k`J:a
bool operator==(bit_iterator<Container>& bitIt) M[TgNWl/[
{ $C^94$W
return m_index == bitIt.m_index; UyK|KL
} "v^Q
!
bool operator!=(bit_iterator<Container>& bitIt) dc%+f
{ k[G? 22t
return !(*this == bitIt); trgj]|?M
} ze,HNFg@>
protected: jQsucs5$h
Container* m_container; u-j Gv| ,|
private: q]
,&$d^@
int m_size; Y.Gr(]tk
int m_index; ? )0U!)tK
}; &XgB-}^:
:ykQ[d`:|
用该迭代器可以将任意类型对象以二进制格式输出: B6=8cf"i
double a = 10; =@{H7z(p&
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));