以二进制格式输出对象基本思路是直接将对象的内存数值以二进制的格式输出,但是如何获取对象内存的二进制结构 yE~D0%Umq
是关键。解决方法是通过位操作找出对象内存的每一个bit的值。并把该方法封装成一个迭代器。 { `xC~B h
要注意的问题是位操作符只能对整数类型进行操作,为了对所有类型的对象都有效,必须将对 fWb+08}C
象当作char数组来处理。 :F9Oj1lM%
template<class Container> 4P"XT
class bit_iterator : public std::iterator<bidirectional_iterator_tag, ;rNX
void, void> 'ka$@,s :
{ i52JY&N
public: 'Hs*
explicit bit_iterator(Container& c) : m_container(&c) ddbQFAQQQ
{ J#q^CWN3R
m_size = 8*sizeof(Container); jp1e3 Cg
m_index = 0; k3KT':*
} Ypxp4B
explicit bit_iterator() : m_container(0) uvw1 _j?
{ &aa3BgxyE
m_size = 8*sizeof(Container); D6"d\Fm<
m_index = m_size; ~)zxIO!
} P]OUzI,
bool operator* () fn.;C
{ TKiYEh
char mask = 1; 4#:C t* f
char* pc = (char*)m_container; 6L)7Q0Z
int i = (m_size-m_index-1)/8; |68u4z K
int off = (m_size-m_index-1)%8; -F 9xPw
mask <<=off; [_}8Vv&6
return pc & mask; `U|zNizO
} C7f*Q[
bit_iterator<Container>& operator++() $RunGaX!=N
{ k+J63+obd
m_index++; a5/Dz&>j6
return *this; vp9wRGd
} .g?D3$|K
bit_iterator<Container>& operator++(int) ruyQ}b:zS
{ {oR@'^N
m_index++; nLC5FA7<
return *this; h%NM%;"H/
} Qpj[]c5
bool operator==(bit_iterator<Container>& bitIt) X[f)0w%
{ M*C1QQf\N
return m_index == bitIt.m_index; ^SW9J^9
} &49WfctT
bool operator!=(bit_iterator<Container>& bitIt) ZLdIEBi=
{ t* p%!xsH
return !(*this == bitIt); P=L@!F+s
} HgBu:x?&
protected: VE1j2=3+o
Container* m_container; xI/8[JW*
private: m(^N8k1K;
int m_size; k#7A@Vb
int m_index; ]ms+Va_/
}; I_ kA!^
{"2CI^!/U.
用该迭代器可以将任意类型对象以二进制格式输出:
Qw
}1mRv
double a = 10; ckv8QAm
copy(bit_iterator<double>(a), bit_iterator<double> (), ostream_iterator<bool>(cout, ""));